Theory/Unclassified

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

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


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


분류는 기본 정규식, 확장 정규식, 펄 호환 정규식2, 이맥스 정규식으로 나누어 살펴보겠다.3


표준 정규식

정규 표현식

의미

 .

임의의 한 문자

 []

문자 클래스

 [^]

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

 ^

문자열이나 행의 시작

 $

문자열이나 행의 끝

 *

앞 요소를 0회 이상

 {n}

앞 요소가 n개

 {n,}

앞 요소가 n개 이상

 {n,m}

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

 ()

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

 \n

일치하는 n번째 패턴


표준 정규식 예 : 이메일4

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


확장 정규식

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

정규 표현식

의미

 .

임의의 한 문자

 ?

앞의 요소를 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}


펄 호환 정규식

펄 호환 정규식은 몇몇 문자 클래스를 제공한다.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


이맥스 정규식

비교표

emacs 정규 표현식

정규 표현식

의미

 \(\)
 ()

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

 \{n,m\}
 {n,m}

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

 \|
 |

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

 [[:word:]_]
 \w

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

 [^[:word:]_]
 \W

단어 아닌 문자

 \sw or \w
 [A-Za-z0-9]

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

 \Sw or \W
 [^A-Za-z0-9]

단어 아닌 문자

 \s-
 \s

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

 \S-
 \S

공백 아닌 문자

 \< and \>
 \b

낱말 경계

 \_<  \_>
 

심볼의 시작/끝


구문 클래스 (syntax classes)
\scode : 구문이 code와 일치
\Scode : 구문이 code와 일치하지 않음

몇가지 구문 코드

구문 코드

의미

 -

공백문자

 w

단어

 _

심볼

 .

구두점

 ( )

괄호 열기, 닫기

 "

인용 부호

 < >

주석 열기, 닫기


이맥스 정규식 예 : 이메일

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


선택 지침

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

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


  1. 이후 정규식으로 줄여서 사용하겠다.
  2. PCRE (Perl-Compatible Regular Expressions)
  3. Regular Expressions 페이지가 많은 도움이 되었다.
  4. 여기에 소개한 예제는 차이점을 비교하기 위해 단순하게 작성했다. 실제 코드에는 사용하지 마라.
  5. 위키백과 정규 표현식 POSIX 확장 문법을 참고하라.
  6. 위키백과 정규 표현식 문자 클래스
  7. 이맥스 정규식의 메타 문자 중에
    \\( \\) \\{ \\} \\|
    는 '\\' 붙어있다. \이 없으면 보통 문자이다. 나머지 메타문자에는 `\\'를 붙일 필요가 없다는 뜻이다.
저작자 표시 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
  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 : 14
Yesterday : 105
Total : 158,502

티스토리 툴바