POSIX 정규 표현식
Programming/RegEx 2013. 2. 3. 18:20 |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 |