정규 표현식
개요
정규 표현식(正規表現式, Regular expression에서 줄여서 Regexp 또는 Regex)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. 정규 표현식은 많은 텍스트 편집기와 프로그래밍 언어에서 문자열의 검색과 치환을 위해 지원하고 있으며, 특히 펄과 Tcl은 언어 자체에 강력한 정규 표현식 구현을 내장하고 있다.
정규 표현식은 컴퓨터 과학의 정규 언어로부터 유래하였으나 구현체에 따라서 정규 언어보다 더 넓은 언어를 표현할 수 있는 경우도 있으며, 심지어 정규 표현식 자체의 문법도 여러 가지 존재하고 있다. 이 중 표준화된 것으로는 POSIX의 확장 정규 표현식이 있으며, 표준화되지는 않았지만 펄의 정규 표현식과 그 대체 구현인 PCRE도 널리 사용된다.
문법
몇몇 문자는 특정한 논리적 관계를 나타내는 기호로 쓰인다. 이를 제외한 나머지 문자는 일반적인 문자를 나타낸다.
§ 선택 기호
"|" 기호는 OR 연산자 기능을 하며 여러 식 중에서 하나를 선택한다. 예를 들어, "abc|adc"는 abc라는 문자열과 adc라는 문자열을 모두 포함한다. abc 또는 adc 둘 중 하나이다.
§ 묶기 기호
"("와 ")"로 여러 식을 하나로 묶을 수 있다. "abc|adc"와 "a(b|d)c"는 같은 의미를 가진다.
a(bc)*는 a, abc, abcbc 등 ‘bc’가 없거나 하나 이상인 경우이다.
a(bc)는 abcbc를 나타낸다.
§ 개수 기호
문자 뒤에 붙어 문자의 개수를 나타낸다.
§ "." : 임의의 한 문자. "a.c"는 "abc", "aac", "azc"를 포함한다. 하지만 ac나 abbc는 안된다.
§ "*" : 바로 앞의 문자가 0개 이상. "a*b"는 "b", "ab", "aab", "aaab"를 포함한다.
§ "+" : 바로 앞의 문자가 1개 이상. "a+b"는 "ab", "aab", "aaab"를 포함하지만 "b"는 포함하지 않는다.
§ "?" : 바로 앞의 한 문자가 0개 또는 1개. "a?b"는 "b", "ab"를 포함한다.
§ "{m, n}" : m개 이상 n개 이하. "a{1,3}b"는 "ab", "aab", "aaab"를 포함하지만, "b"나 "aaaab"는 포함하지 않는다.
이에 따라 "(fa|mo|b?o)ther"는 "father", "mother", "bother", "other"를 나타낸다.
많은 프로그래밍 언어에서는 이를 확장한 문법을 가지고 있다. 이 중 일반적으로 사용되는 연산자는 다음과 같다.
§ "[]"
"["과 "]" 사이의 문자 중 하나를 선택한다. "|"를 여러 개 쓴 것과 같은 의미를 가진다. 예를 들면 [abc]d는 ad, bd, cd를 뜻한다. 또한, "-" 기호와 함께 쓰면 문자의 범위를 지정할 수 있다. "[a-z]"는 a부터 z까지 중 하나, "[1-9]"는 1부터 9까지 중의 하나를 뜻한다.
§ "[^]"
"[^"과 "]" 사이의 문자를 제외한 나머지 하나를 선택한다. 예를 들면 [^abc]d는 ad, bd, cd는 포함하지 않고 ed, fd 등을 포함한다. [^a-z]는 알파벳 소문자로 시작하지 않는 모든 문자를 나타낸다.
§ "^", "$"
각각 문자열의 처음과 끝을 나타낸다.
“^The”는 “The”로 시작 하는 문자를 말한다
“The end$”는 “The end”로 끝나는 문자열이다.
확장 정규 표현식
위에서 설명한 ?, +, \{\}, (), | 등이 이에 해당 된다.
POSIX 문자 클래스(POSIX Character Classes)
[:class:]
일치하는 문자의 범위를 지정하는 다른 방법이다.
[:alnum:] 는 알파벳이나 숫자와 일치하고 [A-Za-z0-9] 와 같은 표현입니다.
[:alpha:] 는 알파벳과 일치하고 [A-Za-z] 와 같은 표현입니다.
[:blank:] 는 빈 칸이나 탭과 일치합니다.
[:cntrl:] 는 제어 문자들과 일치합니다.
[:digit:] 는 10진 숫자들과 일치하고 [0-9] 와 같은 표현입니다.
[:graph:] (출력가능한 그래픽 문자들). 아스키 33 - 126 의 문자들과 일치합니다. 빈 칸 문자가 포함되지 않는다는 것만 제외하고는 밑에서 설명할 [:print:] 와 같습니다.
[:lower:] 는 알파벳 소문자와 일치하고 [a-z] 와 같은 표현입니다.
[:print:] (출력 가능한 문자들). 아스키 32 - 126 까지의 문자들과 일치합니다. 위에서 설명한 [:graph:] 와 같지만 빈 칸 문자가 포함되어 있습니다.
[:space:] 는 공백문자들과 일치합니다(빈 칸, 수평탭).
[:upper:] 는 알파벳 대문자와 일치하고 [A-Z] 와 같은 표현입니다.
[:xdigit:] 는 16진수 숫자와 일치하고 [0-9A-Fa-f] 와 같은 표현입니다.
'System > Linux' 카테고리의 다른 글
리눅스 환경에서 C 프로그래밍 (0) | 2011.02.10 |
---|---|
[이만용의 Open Mind] 프로그래밍 지형도를 바꾸는「파이썬」 (0) | 2011.02.07 |
리눅스 - usb 마운트 (0) | 2011.02.06 |
TCP wrappers (0) | 2011.01.25 |
리눅스 - xinetd과 서비스 (0) | 2011.01.25 |