정규 표현식

개요

정규 표현식(正規表現式, 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” 끝나는 문자열이다.

 

확장 정규 표현식

egrepawk에서 쓰인다.

위에서 설명한 ?, +, \{\}, (), | 등이 이에 해당 된다.

 

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] 와 같은 표현입니다.

 

Posted by linuxism
,