POSIX 표준 정규 표현식에 익순해진 뒤에는 더 많은 기능을 가진 펄(Perl) 확장 정규 표현식인 PCRE(Perl Compatible Regular Expression) 도 배워두면 좋다.

PCRE는 대부분의 언어에서 라이브러리를 제공하므로 확장성도 뛰어나다.


정규 표현식의 메타 문자들

문자 지정 

임의의 문자 하나를 의미

반복 지정 

문자 패턴이 0개 혹은 1개를 나타냄

 

문자 패턴이 1개 이상 반복 

 

문자 패턴이 0개 이상 반복 

 

{ ... } 

(interval) 반복수를 직접 지정할 수 있다. 예를 들어, {3}은 3번 반복, {,7}은 일곱 번 이하 반복, {2,5}은 두 번 이상, 다섯 번 이하  반복

위치 지정 

행의 맨 앞을 의미 

 

행의 맨 끝을 의미 

그룹 지정 

[ ... ] 

대괄호 안에 지정된 문자 중 한 문자를 지정 

 

 [ ^... ]

대괄호 안에 지정된 문자를 제외한 나머지(여집합)를 지정 

기타 

메타 문자를 이스케이프(escape) 한다 

 

OR 연산을 한다(alternation) 

 

( ) 

패턴을 그룹화하거나 백레퍼런스로 작동 

POSIX 표준 정규 표현식은 문자, 반복, 위치, 범위, 기호의 메티 문자로 구성되며, 기본 패턴은 위와 같이 다섯 개 그룹으로 나눌 수 있다.


문자 지정 그룹

메타 문자에서 마침표(.)는 임의의 문자 하나를 의미한다. 영문자나 숫자, 기호 등 어느 것이든 하나의 문자와 일치한다. 따라서 t...k 처럼 작성하면, t와 k사이에 임의의 문자 세 개가 들어있는 단어(think나 thick 등)가 매칭된다.


반복 지정 패턴

반복을 지정하는 메타 문자(?, +, *, {...}) 는 바로 앞에 있는 문자나 패턴의 반복수를 지정한다.


?는 바로 앞의 문자에 대해 0개 혹은 1개와 일치한다. 예를 들어 a?b 라고 하면 ?앞에 있는 a가 있거나 없다는 뜻이된다. 따라서 a?b 는 b 혹은 ab와 매칭된다.

만일 a.?s 가 되면 a 다음에 임의의 문자(.)가 0개 혹은 1개 나오고 그 뒤에 s가 있는 문자(as, abs, ats 등)와 매칭된다.


+는 바로 앞의 문자에 대해 1개 이상과 일치하며, *는 바로 앞의 문자에 대해 0개 이상과 일치한다. 

예를 들어 a+b라고 하면 a가 하나 이상 앞에 나오고, b가 뒤따르는 문자(ab, aab, aaab 등) 와 일치하며, 

a*b 라고 하면 a가 0개 이상 앞에 나오고 b가 뒤따르는 문자(b, ab, aab 등)와 일치한다.


마지막으로 사용자가 임의의 반복수를 지정할 수 있는 메타 문자는 중괄호( { } ) 로 감싸서 표시한다. 중괄호 안에는 최소, 최대 반복수를 지정할 수 있는데, 예를 들어 {2,5}라고 하면 바로 앞의 문자가 최소 2번 이상, 최대 5번 이하 반복된다는 의미이다. 

반복수 중에 앞부분을 생략하여 {,5} 라고 하면 0번 이상, 다섯 번 이하라는 의미이고, 뒷 부분을 생략하여 {2, } 라고 하면 최대 반복에 제한이 없다는 의미이다.

따라서 0개 혹은 1개와 일치하는 ?는 {0,1}로 쓸 수 있고 1개 이상을 의미하는 +는 {1, } 로 쓸 수 있다. 또 0개 이상을 의미하는 *는 {0, }와 같다.


※ a* 같은 표현식을 만날 때,

단독으로 a* 나 [0-9]* 같이 표현식을 작성하는 경우를 종종 보게 되는데, 이는 모든 문자와 알치하므로 잘못된 표현식이라 할 수 있다. 따라서 * 기호 앞에 문자가 하나만 있는 표현식이라면 잘못 작성했다고 판단하면 된다.

이런 경우에는 * 대신 + 를 사용하는 편이 좀 더 정확한 표현식을 작성할 수 있다.


위치 지정 패턴

위치를 지정하는 기호는 ^과 $이다. 일반적으로 ^는 행의 시작을 의미하고, $는 끝을 의미한다. 예를 들어 ^abc 라고 하면 행의 시작 부분에 있는 abc와 일치하고, boy$라고 하면 행의 끝 부분에 있는 boy와 일치한다. 

이를 응용하여 ^$라고 하면, 행의 시작과 끝 사이에 아무것도 없는 행, 즉 비어있는 행과 일치한다.

여기서는 행 단위에 국한되었지만 가끔 ^, $가 특정 스트림의 맨 앞과 맨 끝을 의미하기도 한다. 


그룹 지정 패턴

그룹을 지정하는 패턴은 [...]와 [^...]로 구분할 수 있다. [...]는 괄호 안에 지정된 문자 중 하나와 일치한다는 의미이다.반대로 [^...]는 괄호 안에 지정된 문자를 제외한 나머지 문자와 일치한다는 의미이다. 

예를 들어 [abc]는 a, b, c 중 하나를 의미한다.

여기에 범위를 적용할 수도 있다. [a-z]는 알파벳 소문자(a부터 z까지)를 의미하고, [0-9]는 숫자(0부터 9)를 의미한다. 복합적인 범위를 적용하여 [a-zA-Z0-9] 처럼 알파벳 대소문자와 숫자 중 하나를 지정할 수도 있습니다.

그룹 패턴은 종종 반복 지정 패턴과 함께 나타나기도 한다. 예를 들어 [a-zA-Z]+ 는 하나 이상(+) 의 대소문자 알파벳([a-zA-Z]) 과 일치한다는 의미이다.


이스케이프

이스케이프(escape)는 백슬래쉬(\) 로 표현되며, 메타 문자의 의미를 없애주는 역할을 한다. 반복 지정 패턴인 * 문자 앞에 백슬래쉬를 붙이면 반복의 의미가 사라지고, 그냥 *문자 자체와 일치한다. 이를 '이스케이프' 라고 한다.


얼터네이션

얼터네이션(alternation) 은 | 으로 표현되며 OR 연산을 의미합니다. 얼터네이션은 대부분 중괄호 기호와 함께 사용됩니다. 예를 들어 (a | b)c 라고 하면 a나 b 중 하나로 시작하며 뒤이어 c가 나타나는 문자(ac, bc)와 일치한다.

단 중괄호에는 백레퍼런스(back reference) 의 의미도 있다는 것을 주의해야 한다.


그룹 지정과 백레퍼런스(/)

그룹(grouping) 이나 백레퍼런스(back-reference) 를 지정할 때는 중괄호가 사용된다. 백레퍼런스는 정규 표현식으로 매칭된 결과 값을 저장해두었다가 변수처럼 사용할 수 있는 기능이다. 


문자 클래스

POSIX 정규 표현식에서의 몇몇 문자 그룹 표 (사용자가 그룹 지정 패턴으로 직접 만들 수 있다)

POSIX 표준 정규 표현식의 문자 클래스

 [[:alnum:]]

알파벳과 숫자 

 [[:alpha:]]

알파벳 대소문자 

 [[:blank:]]

 탭(\t)

[[:cntrl:]] 

제어 문자 

[[:digit:]] 

숫자 

[[:xdigit:]] 

16진수(hex)형 숫자, 즉 [0-9a-fA-F] 

 [[:upper:]]

알파벳 대문자 

[[:lower:]] 

알파벳 소문자 

[[:space:]] 

탭(\t), CR(\r), LF(\n) 

[[:print:]] 

출력 가능한 문자 

 [[:graph:]]

공백을 제외한 문자 

[[:punct:]] 

출력 가능한 특수 문자 

이들 중 alnum, alpha, digit, xdigit은 주로 사용된다.



'Programming > RegEx' 카테고리의 다른 글

정규 표현식(Regualr Expression)  (0) 2013.05.05
태그 찾기  (0) 2013.02.12
[Python] Regular Expression  (0) 2013.02.07
URL 교체하기  (0) 2013.02.03
정규 표현식의 활용(이메일 주소 변경)  (0) 2013.02.03
Posted by scii
: