기타

정규식

그란. 2018. 12. 24. 14:43

기본 정규식 이해


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

 


'기타' 카테고리의 다른 글

앱 개발에 대한 생각  (0) 2021.07.08
앱 관리에 대한 생각  (0) 2021.06.11
JetBrain IDE 가 현재 가장 좋은 툴인 이유  (0) 2018.08.02