기본 정규식 이해
정규식(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개
게시글 목록
| 번호 | 제목 |
|---|---|
| 535 | |
| 534 | |
| 533 | |
| 522 |
이미지관련
문자열이미지에 각종 필터를 적용한 결과
7
|
| 521 |
이미지관련
이미지에 각종 필터를 적용한 결과
2
|
| 520 |
이미지관련
프레임이미지와 얼굴이미지 합치기
|
| 517 | |
| 516 | |
| 511 |
이미지관련
이미지 너비에 맞게 문자열의 자동 개행
2
|
| 508 | |
| 507 |
이미지관련
문자열 그릴때 패딩 주기
2
|
| 500 |
이미지관련
위치에 따른 이미지에 문자열 그리기
6
|
| 493 | |
| 490 |
이미지관련
문자열의 너비와 높이 구하기
1
|
| 486 |
이미지관련
이미지에 글자 쓰기
5
|
| 463 | |
| 461 | |
| 444 | |
| 435 | |
| 334 | |
| 304 | |
| 290 |
정규표현식
정규표현식 의 핵심. 패턴변경자 1
20
|
| 244 | |
| 233 |
정규표현식
설문조사 진행 중입니다. ~1월 28일까지
|
| 218 | |
| 217 | |
| 194 | |
| 185 | |
| 181 | |
| 156 |
정규표현식
정규표현식의 기본구조
17
|
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기