Today
-
Yesterday
-
Total
-
  • 정규 표현식의 분류에 따른 차이점과 올바른 사용법
    Programmer/Computer Science 2015. 1. 19. 15:54

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


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


    분류는 기본 정규식, 확장 정규식, 펄 호환 정규식(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

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

    [[:digit:]]

    \d

    숫자

    \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. [정규표현식] 이것이 고급이다 - (Positive, Negative) Lookahead, Lookbehind [본문으로]
    2. 이맥스 정규식의 메타 문자 중에 '\(' '\)' '\{' '\}' '\|'는 '\' 붙어있다. '\'이 없으면 보통 문자이다. 나머지 메타문자에는 `\'를 붙일 필요가 없다는 뜻이다. [본문으로]

    댓글

Designed by Tistory.