정규 표현식

위키백과, 우리 모두의 백과사전.
이동: 둘러보기, 검색
노랑색 강조 부분은 다음 정규식을 사용했을 때 매치된 것이다.
(?:\.) {2,}(?=[A-Z])

정규 표현식(正規表現式, 영어: regular expression, 간단히 regexp 또는 regex)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. 정규 표현식은 많은 텍스트 편집기프로그래밍 언어에서 문자열의 검색과 치환을 위해 지원하고 있으며, 특히 Tcl은 언어 자체에 강력한 정규 표현식을 구현하고 있다.

컴퓨터 과학의 정규 언어로부터 유래하였으나 구현체에 따라서 정규 언어보다 더 넓은 언어를 표현할 수 있는 경우도 있으며, 심지어 정규 표현식 자체의 문법도 여러 가지 존재하고 있다. 이 중 표준화된 것으로는 POSIX의 확장 정규 표현식이 있으며, 표준화되지는 않았지만 펄의 정규 표현식과 그 대체 구현인 PCRE도 널리 사용된다.

문자열토큰으로 변환하는 과정에서 텍스트를 좌에서 우로 검사하면서 여러 규칙과 일치될 문자의 수량을 다양하게 시도하는 처리에 가장 적합할 뿐 파싱에는 적절치 않다.[1]

문법[편집]

문자 클래스, "["와 "]" 사이에 포함된 문자 집합 외부에서는 12개의 문자가, 내부에서는 오직 4개의 문자("\", "^", "-", "]", 자바닷넷은 "["를 포함)만 특수문자를 의미한다. [2]

기능 설명
. 문자 1개의 문자와 일치한다. 단일행 모드에서는 새줄 문자를 제외한다.
\ 이스케이프 특수 문자를 식에 문자 자체로 포함한다.
¦ 선택 여러 식 중에서 하나를 선택한다. 예를 들어, "abc¦adc"는 abc와 adc 문자열을 모두 포함한다.
^ 부정 문자 클래스 안의 문자를 제외한 나머지를 선택한다. 예를 들면 [^abc]d는 ad, bd, cd는 포함하지 않고 ed, fd 등을 포함한다. [^a-z]는 알파벳 소문자로 시작하지 않는 모든 문자를 의미한다.
[] 문자 클래스 "["과 "]" 사이의 문자 중 하나를 선택한다. "¦"를 여러 개 쓴 것과 같은 의미이다. 예를 들면 [abc]d는 ad, bd, cd를 뜻한다. 또한, "-" 기호와 함께 쓰면 범위를 지정할 수 있다. "[a-z]"는 a부터 z까지 중 하나, "[1-9]"는 1부터 9까지 중의 하나를 의미한다.
() 하위식 여러 식을 하나로 묶을 수 있다. "abc¦adc"와 "a(b¦d)c"는 같은 의미를 가진다.
* 0회 이상 0개 이상의 문자를 포함한다. "a*b"는 "b", "ab", "aab", "aaab"를 포함한다.
+ 1회 이상 "a+b"는 "ab", "aab", "aaab"를 포함하지만 "b"는 포함하지 않는다.
 ? 0 또는 1회 "a?b"는 "b", "ab"를 포함한다.
{m} m회 "a{3}b"는 "aaab"만 포함한다.
{m,} m회 이상 "a{2,}b"는 "aab", "aaab", "aaaab"를 포함한다. "ab"는 포함되지 않는다.
{m, n} m회 이상 n회 이하 "a{1,3}b"는 "ab", "aab", "aaab"를 포함하지만, "b"나 "aaaab"는 포함하지 않는다.


이에 따라 "(fa|mo|b?o)ther"는 "father", "mother", "bother", "other"를 나타낸다.

많은 프로그래밍 언어에서는 이를 확장한 문법을 가지고 있다. 이 중 일반적으로 사용되는 연산자는 다음과 같다.

  • "^", "$" : 각각 문자열이나 행의 처음과 끝을 나타낸다.

문자 클래스[편집]

문자 클래스는 문자열 일치 다음으로 가장 기본적인 정규 표현식 개념이다. 이는 하나의 작은 일련의 문자열들을 더 큰 집합의 문자열들과 일치시키도록 한다. 이를테면, [A-Z]는 알파벳을 대표하며 \d는 임의의 숫자를 의미할 수 있다. 문자 클래스는 POSIX 수준에 적용한다.

[a-Z]와 같은 특정 범위의 문자들을 지정할 때 컴퓨터의 로캘 설정들은 문자 인코딩의 수치적 나열에 따라 내용을 결정한다. 그러한 나열에 따라 수치들을 저장할 수 있으며 그 순서는 abc...zABC...Z, aAbBcC...zZ와 같이 될 수 있다. 그러므로 POSIX 표준은 문자 클래스를 정의하며 이는 설치된 정규 표현식 처리기가 인지한다. 이러한 정의들은 다음의 표를 따른다:

POSIX 비표준 펄/Tcl Vim ASCII 설명
[:alnum:] [A-Za-z0-9] 영숫자
[:word:] \w \w [A-Za-z0-9_] 영숫자 + "_"
\W \W [^A-Za-z0-9_] 낱말이 아닌 문자
[:alpha:] \a [A-Za-z] 알파벳 문자
[:blank:] \s [ \t] 공백과 탭
\b \< \> (?<=\W)(?=\w)|(?<=\w)(?=\W) 낱말 경계
[:cntrl:] [\x00-\x1F\x7F] 제어 문자
[:digit:] \d \d [0-9] 숫자
\D \D [^0-9] 숫자가 아닌 문자
[:graph:] [\x21-\x7E] 보이는 문자
[:lower:] \l [a-z] 소문자
[:print:] \p [\x20-\x7E] 보이는 문자 및 공백 문자
[:punct:] [][!"#$%&'()*+,./:;<=>?@\^_`{|}~-] 구두점
[:space:] \s \_s (단순히 줄 끝에 추가) [ \t\r\n\v\f] 공백 문자
\S [^ \t\r\n\v\f] 공백이 아닌 모든 문자
[:upper:] \u [A-Z] 대문자
[:xdigit:] \x [A-Fa-f0-9] 16진수

주석[편집]

  1. 잰 고이바에르츠, 스티븐 리바이선 저 김지원 역, 《한 권으로 끝내는 정규표현식》, 한빛미디어(주), 2010, 216쪽
  2. 같은 책, 53쪽

바깥 고리[편집]