기본 정규식 이해
정규식(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
위의 정규식에서 \. 패턴은 실제의 . 문자를 매칭하고 있다.
Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다