Theory/Unclassified

정규 표현식의 분류에 따른 차이점과 올바른 사용법

정규 표현식은 개발이나 운영에 중요한 도구다.
매뉴얼이 없어도 자유자재로 사용할 필요가 있다.


이 글은 유사성을 묶어서 알아야 하는 내용을 줄이고,
각 분류 간의 차이점을 드러내어 지식을 확장하는 방법을 사용하였다.


분류는 기본 정규식, 확장 정규식, 펄 호환 정규식(PCRE, Perl-Compatible Regular Expressions), 이맥스 정규식으로 나누어 살펴보겠다.


표준 정규식

정규 표현식

의미

.

임의의 한 문자

[]

문자 클래스

[^]

부정 문자 클래스. 문자 클래스 안의 문자를 제외한 나머지를 선택

^

문자열이나 행의 시작

$

문자열이나 행의 끝

*

앞 요소를 0회 이상

{n}

앞 요소가 n개

{n,}

앞 요소가 n개 이상

{n,m}

앞 요소가 n개 이상, m개 이하

()

하위식. 정규식 안에 하위 패턴을 지정해서 사용할 경우 사용

\n

일치하는 n번째 패턴


표준 정규식 예 : 이메일

[A-Za-z0-9_]{1,}@[A-Za-z0-9-]{1,}(\.[A-Za-z0-9-]{1,})*\.[A-Za-z]{2,6}


확장 정규식

확장 정규식에는 표준 정규식에 없는 몇가지 메타 문자가 추가되었다.

정규 표현식

의미

.

임의의 한 문자

?

앞의 요소를 0 또는 1회

+

앞의 요소를 1회 이상

|

둘 중의 하나. 예를 들면, "abc|adc"는 "abc"와 "adc" 모두 포함


구문 클래스(syntax classes)

구문 클래스

의미

[:digit:]

숫자

[:alpha:]

문자

[:alnum:]

문자 또는 숫자

[:upper:]

대문자

[:space:]

공백 문자

[:xdigit:]

16진수 숫자

[:cntrl:]

제어 문자

[:ascii:]

ascii 문자


확장 정규식 예 : 이메일

[[:alnum:]_]+@[[:alnum:]-]+(\.[[:alnum:]-]+)*\.[[:alpha:]]{2,6}


펄 호환 정규식

펄 호환 정규식은 몇몇 문자 클래스를 제공한다.

문자 클래스

의미

\w

단어 (영문자, 숫자, '_')

\W

영문자, 숫자, `_' 아닌 문자

\b

낱말 경계

\d

숫자

\D

숫자 아닌 문자

\s

공백 : \t \r \n \v \f

\S

공백 아닌 문자


펄 호환 정규식 예 : 이메일

\b\w+@[\dA-Za-z-]+(\.[\dA-Za-z-]+)*\.[A-Za-z]{2,6}\b


패턴 변경자 (modifiers)

PCRE 변경자는 (?aimsx)의 표현으로 정규 표현식을 변경할 수 있다.

패턴 변경자

의미

i

대문자와 소문자를 구별하자 않음

m

"줄 시작"과 "줄 끝"은 주어진 문자열의 모든 뉴라인 직후와 직전을 인식

s

점 메타문자는 뉴라인을 포함하는 모든 문자를 인식

x

공백 문자는 이스케이프 되거나 문자 클래스 안에 있을 경우를 제외하고, 완전히 무시

패턴 변경자 사용 예

(?i)a

a와 A


positive and negative look-around[각주:1]

정규 표현식

이름

사용 형태

의미

(?=)

positive lookahead

a(?=b)

a 다음 b가 일치

(?!)

negative lookahead

a(?!b)

a 다음 b가 일치하지 않음

(?<=)

positive lookbehind

(?<=a)b

a가 일치하고 b가 나옴

(?<!)

positive lookbehind

(?<!a)b

a가 일치하지 않고 b가 나옴

positive and negative look-around 사용 예

apple(?= computer)
apple(?! computer)
(?<=apple )computer

apple 다음에 ' computer'가 나오는 apple만 얻음
apple 다음에 ' computer'가 나오지 않는 apple만 얻음
'apple ' 다음에 오는 computer만 얻음


이맥스 정규식

비교표

emacs 정규 표현식

정규 표현식

의미

\(\)

()

하위식. 정규식 안에 하위 패턴을 지정해서 사용할 경우 사용[각주:2]

\{n,m\}

{n,m}

앞 요소가 n개 이상, m개 이하

\|

|

둘 중의 하나. 예를 들면, "abc\|adc"는 "abc"와 "adc" 모두 포함

[[:word:]_]

\w

단어 (영문자, 숫자, '_')

[^[:word:]_]

\W

단어 아닌 문자

\w \sw

[A-Za-z0-9]

단어 (영문자, 숫자, '_')

\W \Sw

[^A-Za-z0-9]

단어 아닌 문자

\s-

\s

공백 문자 (아래 구문 클래스 참고)

\S-

\S

공백 아닌 문자

\< \>

\b

낱말 경계

\_< \_>

심볼의 시작/끝


구문 클래스 (syntax classes)

  • \scode : 구문이 code와 일치
  • \Scode : 구문이 code와 일치하지 않음

몇가지 구문 코드

구문 코드

의미

-

공백문자

w

단어

_

심볼

.

구두점

( )

괄호 열기, 닫기

"

인용 부호

< >

주석 열기, 닫기

구문 클래스 예
\sw 단어와 일치, \Sw 단어와 일치하지 않음


이맥스 정규식 예 : 이메일

\<[[:word:]_]+@[[:word:]-]+\(\.[[:word:]-]+\)*\.[[:word:]]\{2,6\}\>


선택 지침

다음은 상황에 맞는 정규식을 선택하는 지침이다.

  • 프로그래밍이 아니고, 확장 정규식이 가능한지 모르겠으면, 기본 정규식만 사용한다.
  • 확장 정규식을 지원하는 도구 몇가지를 기억한다.
    몇가지 되지 않으니 외워두자. awk, egrep 등
    확장 정규식을 사용할 수 있으면 잘 활용한다.
  • 프로그래밍을 할때는 펄 호환 정규식을 사용한다.
    대부분의 프로그래밍 언어/라이브러리에서 사용한다.
  • 이맥스 환경에서는 이맥스 정규식을 사용한다.


  1. <a class="tx-link" target="_blank" href="http://unlimitedpower.tistory.com/entry/%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D-%EC%9D%B4%EA%B2%83%EC%9D%B4-%EA%B3%A0%EA%B8%89%EC%9D%B4%EB%8B%A4-Positive-Negative-Lookahead-Lookbehind">[정규표현식] 이것이 고급이다 - (Positive, Negative) Lookahead, Lookbehind</a> [본문으로]
  2. 이맥스 정규식의 메타 문자 중에 '(' ')' '{' '}' '|'는 '' 붙어있다. ''이 없으면 보통 문자이다. 나머지 메타문자에는 `'를 붙일 필요가 없다는 뜻이다. [본문으로]
저작자 표시 변경 금지
신고
  1. Favicon of http://www.johndcook.com/blog/regex-perl-python-emacs/ John D. Cook M/D Reply

    Comparing regular expressions in Perl, Python, and Emacs

    http://www.johndcook.com/blog/regex-perl-python-emacs/

알림

이 블로그는 구글에서 제공한 크롬에 최적화 되어있고, 네이버에서 제공한 나눔글꼴이 적용되어 있습니다.

카운터

Today : 68
Yesterday : 341
Total : 179,320