기본 정규식 이해 > 개발강좌

개발강좌

프로그램 강좌 :
1. 유창화님의 썸네일, 정규표현식, 이미지관련 강좌
2. Sphinx 검색엔진을 이용한 도로명 주소 검색 시스템 구축

기본 정규식 이해 정보

정규표현식 기본 정규식 이해

본문

기본 정규식 이해


  정규식(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

 

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

추천
3

댓글 7개

전체 3

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT