테스트 사이트 - 개발 중인 베타 버전입니다

기본 정규식 이해

· 8년 전 · 7376 · 7

기본 정규식 이해


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

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

게시글 목록

번호 제목
716
715
714
713
712
711
710
정규표현식 PHP 정규식 정리 3
709
708
707
706
정규표현식 정규식 기초
695
689
688
687
656
651
643
638
633
606
593
584
576
562
556
539
538
537
536