2026, 새로운 도약을 시작합니다.

기본 정규식 이해

기본 정규식 이해


  정규식(Regular Expression)은 문자열의 패턴을 기술하는 일종의 미니 언어로, 텍스트 처리 작업이 많은 웹 프로그래밍에서는 필수적인 기능이라고 할 수 있다. 루비에서는 정규식 리터럴이 신택스 레벨에서 지원되기 때문에, 정규식의 사용이 무척 편리하다. 루비에서 정규식은 다음과 같은 방법으로 선언된다.

 >> /Perl/

 => /Perl/

 정규식은 /.../ 의 형태로 작성되는데, 위의 정규식은 Perl이라는 텍스트를 인식하는 패턴이다. 정규식을 사용하면, 주어진 텍스트의 일부를 치환하는 것이 가능하다.

 >> “Perl is cool. I like Perl!”.sub(/Perl/, “Ruby”)

 => “Ruby is cool. I like Perl!”

위의 코드에서 문자열의 sub 메소드는 원래 문자열에서 /Perl/패턴에 일치하는 첫 번째 부분을 Ruby로 치환해 주고 있다. 문자열에서는 패턴이 일치하는 모든 부분을 Ruby로 치환하고 싶다면, gsub 메소드를 사용한다.

 >> “Perl is cool. I like Perl!”.gsub(/Perl/.”Ruby”)

 => “Ruby is cool. I like Ruby!”

하나의 정해진 문자열이 아니라 특정 패턴을 인식하는 정규식을 작성하는 것도 가능하다. 다음은 Perl 문자열과 PHP 문자열을 동시에 매칭하는 정규식이다.

 >> /P(erl|HP)/

 => /P(erl|HP)/

정규식에서 | 는 or의 의미를 가진다.

 >> “Perl is cool. I like PHP!”.gsub(/P(erl|HP)/, “Ruby”)

 => “Ruby is cool. I like Ruby!”

특정 문자 그룹을 매칭하고 싶다면 [...] 패턴을 사용할 수 있다.

 >> “innvation”.sub(/[aeiou]/, “*”)

 => “*nnvotaion”

 >> “innovation”.gsub(/[aeiou]/, “*”)

 => “*nn*v*t**n”

[...] 패턴에는 문자의 범위를 사용할 수도 있다.

 >> “The password is 9428.“.gsub(/[0-9]/,”*”)

 => “The password is ****.”

[...] 안에서 처 번째로 사용된 문자가 ^라면, 역패턴이 매칭된다.

 >> “I love Seoul!”.gsub(/[^a-zA-Z]/,”*”)

 => “I*love*Seoul*”

. 는 모든 문자를 매칭하는 패턴이다. . 하나의 문자를 매칭하게 된다.

 >> “Ruby is cool.”.sub(/.ool/,”fun”)

 => “Ruby is fun”

특정 패턴이 반복되는 것을 매칭할 때는 + or * 이 사용된다. + 는 특정 패턴이 1회 이상 반복하는 것을 매칭하고, * 는 특정 패턴이 0회 이상 반복하는 것을 매칭한다.

 >> “Ruby is coooool.”.sub(/o+/, “oo”)

 => “Ruby is cool.”

만약 하나 이상의 문자가 반복되는 패턴을 인식하려면, 괄호를 사용할 수 있다.

 >> “1001001001888”.sub(/(001)+/, “”)

 => “1888”

앞서 설명한 정규식을 조합해서 사용할 수 있다.

 >> “The password is 9428.”.sub(/[0-9]+/,”*”)

 => “The password is *.”

정규식이 텍스트의 치환에만 사용되는 것은 아니다. 주어진 문자열이 특정 패턴을 가지고 있는지 아닌지를 테스트하는 것도 정규식의 중요한 용도 중의 하나이다.

>> “A year has 365 days.” =- /[0-9]+/

=> 11

 위에서는 문자열의 =- 연산자를 이용하여 해당 문자열에 숫자가 있는지 없는지를 테스트하고 있다. =- 연산자는 문자열의 몇 번째 인덱스에서 패턴매칭이 일어났는지를 리턴한다. 만약 패턴 매칭에 실패하면 nil이 리턴된다. 루비에서는 nil과 false외의 모든 값은 true로 인식되기 때문에, =- 연산자는 조건문에서 사용될 수 있다.

>> if “A year has 365 days.” =- /[0-9]+/

>>      puts “There is a number in the starting!”

>> end

There is a number in the starting!

=> nil

=- 연산자로 문자열의 패턴을 인식하는 경우, 괄호를 사용하여 패턴이 매칭된 부분을 읽어들일 수 있다.

  >> if “A year has 365 days.” =- /[0-9]+/

  >>      put $1

  >> end

  365

  => nil

 위에서는 /[0-9]+/ 패턴에 매칭된 문자열이 $1 변수에 저장되고 있다. 만약 패턴에서 두 개 이상의 괄호가 사용된다면, 각 괄호에 의해 매칭된 문자열이 차례로 $1, $2, $3, … 변수에 저장된다.

  >> if “210.163.138.100” =- /([0-9]+)\. ([0-9]+)\. ([0-9]+)\. ([0-9]+)/

  >>     puts $1

  >>     puts $2

  >>     puts $3

  >>     puts $4

  >> end

 210

 163

 138

 100

 => nil

위의 정규식에서 \. 패턴은 실제의 . 문자를 매칭하고 있다.

|

댓글 7개

감사합니다
스크랩 해놓고 천천히 공부해야겠네요
좋은 강의 감사합니다!
정규식 너무 어려운데 감사합니다
이런글이필요했었는데
정말초보자가보기편한글이네요감사합니다
공부에 많은 도움이 됩니다.
감사합니다.

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기

개발강좌

프로그램 강좌 :
1. 유창화님의 썸네일, 정규표현식, 이미지관련 강좌
2. Sphinx 검색엔진을 이용한 도로명 주소 검색 시스템 구축
번호 분류 제목 글쓴이 날짜 조회
108 그누보드5 2주 전 조회 35
107 그누보드5
[그누보드5]
4개월 전 조회 157
106 그누보드5 5개월 전 조회 395
105 그누보드5 6개월 전 조회 374
104 그누보드5 7개월 전 조회 312
103 그누보드5 2년 전 조회 1,284
102 그누보드5 2년 전 조회 944
101 그누보드5 2년 전 조회 1,037
100 그누보드5 2년 전 조회 2,338
99 그누보드5 2년 전 조회 872
98 정규표현식 2년 전 조회 1,173
97 그누보드5 3년 전 조회 2,359
96 그누보드5 3년 전 조회 2,742
95 그누보드5 3년 전 조회 3,281
94 그누보드5 3년 전 조회 3,656
93 그누보드5 3년 전 조회 2,894
92 그누보드5 5년 전 조회 5,749
91 그누보드5 5년 전 조회 3,405
90 그누보드5 7년 전 조회 8,303
89 정규표현식 7년 전 조회 8,340
88 그누보드5 7년 전 조회 4,620
87 정규표현식
[정규표현식]
8년 전 조회 7,443
86 그누보드5 8년 전 조회 5,488
85 정규표현식 8년 전 조회 4,130
84 정규표현식 8년 전 조회 3,738
83 정규표현식 8년 전 조회 3,408
82 정규표현식 8년 전 조회 3,631
81 이미지관련 8년 전 조회 8,492
80 이미지관련 8년 전 조회 6,705
79 정규표현식 8년 전 조회 4.7만
🐛 버그신고