정규 표현식 자습서 [개정판]

개인적으로 활용하려고 만든 레퍼런스이긴 하나 막상 만들어놓고보니 혼자서만 쓰기에는 아깝다는 느낌이 들어서 공개합니다. 많이들 활용하시길 바래요.


…    일반 문자열 자체를 의미한다.


예:    abc – ‘abc’, ‘aabc’ (O)


.    개행 문자 (즉 “n”)를 제외한 임의의 문자 한 개와 매치한다.


예:    a.c – ‘abc’ (O), ‘ac’ (X)


*    바로 앞에 있는 패턴이 0번 혹은 그 이상 반복되는 것을 의미한다.


예:    abc – a + b가 0개 이상 + c


[]    대괄호 안에 있는 임의의 문자와 매치하는 문자 클래스이다. 그러나 첫 번째 문자가 캐럿(“^”)이면 대괄호 안에 있는 문자를 제외한 어떠한 문자와도 매치한다는 의미가 된다. 대시(“-”)가 대괄호 안에 존재하면 대시 앞뒤 문자 사이의 범위를 가리킨다. 예를 들어, “[0-9]”는 “[0123456789]”와 동일한 의미이다. 문자 클래스에 대시나 대괄호(“]”)를 포함할 수 있도록 하기 위해서, “[” 바로 다음에 나타난 문자가 “-” 혹은 “]”이면 각각의 특별한 의미 없이 문자 그대로 해석한다. POSIX는 비 영어권 문자를 다룰 때 유용한 특수 대괄호를 도입하였다. 대괄호 안에서는 “” 문자로 시작하는 C 언어의 이스케이프 시퀀스를 제외한 나머지 모든 메타 문자들이 특별한 의미를 상실한다.


예:    a[bcd]c – a + b, c, d 중 한 문자 + c


예:    a[^bcd]c – a + b, c, d가 아닌 한 문자 + c


예:    a[a-z]c – a + a ~ z 중 한 문자 + c


^    행의 시작에서 정규 표현식의 첫 번째 문자가 매치한다. 한편 대괄호 안에서는 부정의 의미로 사용된다.


예:    ^123 – 123, 1230 (O) | 0123 (X)


$    행의 끝에서 정규 표현식의 마지막 문자가 매치한다.


예:    123$ – 123, 0123 (O) | 1230 (X)


{}    괄호 안에 하나 또는 두 개의 숫자를 담고 있을 경우 괄호 앞에 있는 패턴이 몇 번 매치해야 하는지를 가리킨다. 예를 들면 A{1, 3}의 경우 문자 A가 최소 한 번에서 연속 세 번까지 나타나야 함을 뜻한다. 중괄호 안에 특정 이름을 담고 있다면, 그 이름으로 대체한다는 것을 의미한다.


{n}    {n} 바로 앞의 문자가 n개다.


예:    ab{2}c – a + b가 두 개 + c


{n,}    {n,} 바로 앞의 문자가 n개 이상이다.


예:    ab{2,}c – a + b가 두 개 이상 + c


{n, m}    {n, m} 바로 앞의 문자가 n개 이상 m개 이하이다.


예:    ab{2,4}c – a + b가 두 개 이상 4개 이하 + c


   메타 문자들의 의미를 파기하고 C 언어 이스케이프 시퀀스를 표현하는 데 사용한다. 예를 들어, “n”은 개행 문자이지만 ”“은 별표 그 자체를 나타낸다.


예:    *, +, ^


+    앞에 있는 정규 표현식이 한 번이나 그 이상 반복하여 매치할 수 있음을 의미한다. 예를 들면 [0-9]+ 와 같이 쓰일 수 있다. 이 패턴은 “1”, “111” 혹은 “123456”에 매치하지만, 빈 문자열에는 매치하지 않는다. 만약 플러스 기호 대신 별표를 이용하면 빈 문자열도 매치된다.


예:    ab+c – a + b가 1개 이상 + c


?    앞에 있는 정규 표현식이 0번이나 한 번 나타날 수 있음을 의미한다. 예를 들어 -?[0-9]+ 와 같은 패턴은 숫자 앞에 마이너스 기호를 붙이거나 붙이지 않을지를 결정할 수 있다.


예:    ab?c – a + b가 없거나 1개 + c


|    앞에 있는 정규 표현식 혹은 뒤에 있는 정규 표현식에 매치한다.


예:    cow|pig|apple – cow 또는 pig 또는 apple


“…”    따옴표 안에 있는 문자들은 C 언어의 이스케이프 시퀀스를 제외한 모든 메타 문자의 의미를 파기하고 문자 그대로 해석한다.


/    ‘/’ 뒤에 있는 정규 표현식이 매치하는 경우에 한해 ‘/’ 앞의 정규 표현식에 매치한다. 예를 들면 0/1의 경우 “01”과 같은 문자열 안에 있는 “0”에 매치하지만, “0” 또는 “02”아 같은 문자열에는 매치하지 않는다. 슬래시 뒤에 있는 패턴과 매치하는 부분은 “사용되지” 않으며, 다음 토큰 검색 과정에서 사용된다. 패턴 한 개 당 슬래시 하나만 허용된다.


()    정규 표현식 여러 개를 새로운 정규 표현식 한 개로 묶는다. 예를 들어 (01)의 경우 문자 시퀀스 01을 의미한다. 괄호는 *, +, 그리고 |와 함께 사용하여 복잡한 패턴을 구성할 때 매우 유용하게 쓰인다.


(?<GroupName>…)    그룹 매칭을 할 때 <GroupName> 부분이 나중에 프로그래밍 방식으로 결과를 탐색할 때 기준으로 사용된다. 뒤이어오는 … 부분에 식을 쓴다.


예:    (?<First>[0-9]{6})-(?<Last>[0-9]{7})


앞서 나열한 연산자 중에서 몇몇은 ([] 처럼) 문자 하나에 대해서만 작동하는 반면 다른 연산자는 정규 표현식 전체를 상대로 작동한다는 사실에 주목하기 바란다. 보통 복잡한 정규 표현식은 간단한 정규 표현식 여러 개를 모아서 만든다.

정규 표현식 자습서 [개정판]”에 대한 3개의 생각

  1. 제 내이버 블로그에 담아갈께요. 물론 출처 표시하구요
    그럼 Creative Commons License 에 위배 되진 않는거죠?
    ㅎㅎ 수고 하세요 좋은 정보 감사합니다.

댓글 남기기