정규표현식: 두 판 사이의 차이

잔글 (일부 예제용 정규표현식이 제대로 출력되지 않는 문제 등 수정(math 태그 사용))
65번째 줄: 65번째 줄:
|}
|}
*'''충청(남|북)?도''' 는 충청남도, 충청북도, 충청도를 표시한다.
*'''충청(남|북)?도''' 는 충청남도, 충청북도, 충청도를 표시한다.
*'''(충청(남|북)?도)는 \1'' 는 위에서 찾은 단어들을 하위 표현식으로 묶어서 역참조에 활용한 것이다. 이 경우 첫째 줄부분만이 검색된다.
*'''(충청(남|북)?도)는 \1''' 는 위에서 찾은 단어들을 하위 표현식으로 묶어서 역참조에 활용한 것이다. 이 경우 첫째 줄부분만이 검색된다.


한편 소괄호가 '''(?(1)참|거짓)'''형태로 '''?'''가 사용되었을 경우에는 조건문 형태로 쓰인 것으로 조건이 참인 경우와 거짓인 경우를 나누어서 지정할 수 있다.
한편 소괄호가 '''(?(1)참|거짓)'''형태로 '''?'''가 사용되었을 경우에는 조건문 형태로 쓰인 것으로 조건이 참인 경우와 거짓인 경우를 나누어서 지정할 수 있다.

2015년 9월 23일 (수) 23:02 판

Regular Expression(RegEx)

개요

정규표현식(Regular Expression)이란 특정 형태(pattern; 패턴)의 데이터를 일괄적으로 찾거나 변경, 치환하기 위해 사용하는 형식언어이다. 정규식이라고도 하며, 영어로는 RegEx 혹은 RegExp로 줄여서 말하기도 한다. 개별 데이터를 사람이 찾거나 변경하는 것은 상당한 시간을 소모하지만, 컴퓨터에 특정 규칙을 지정하여 일괄적으로 찾거나 변경하는 것은 상대적으로 적은 시간을 소모한다. 일반적으로는 텍스트 문자열(문자와 숫자)을 다루는데 특화되어 있으나, 바이너리 데이터를 변경하는 데에도 많이 사용한다. 초창기에는 1970년대 UNIX에서 grep 필터나 텍스트 에디터에서 주로 사용되었는데, UNIX의 개발언어가 C(프로그래밍 언어)였고 C가 범용적으로 사용되어 후대 프로그래밍 언어에 영향을 준 까닭에, 대부분의 프로그래밍 언어가 정규표현식을 지원한다. 현재 POSIX 표준의 정규표현식 문법과 이를 확장한 Perl의 정규표현식 문법이 주류를 이루고, 각 프로그래밍 언어와 데이터베이스, 텍스트 에디터마다 다소 차이가 있는 정규표현식 문법을 지원한다.

컴퓨터 분야에서 정규표현식이 쓰이지 않는 경우는 극히 드물다. 예를 들어 웹 브라우저는 텍스트 형태로 표현된 HTML 문서를 시각화하기 위하여 태그를 패턴으로 읽어 처리한다. 리브레위키의 미디어위키 엔진은 위키문법에 맞춰 작성한 문서를 HTML 형식에 맞게 변형하여 웹브라우저에 전달한다. 리브레위키의 띄어쓰기, 맞춤법 들은 문서를 읽어 띄어쓰기가 안된 부분이나 흔한 맞춤법 실수를 올바르게 변경하도록 작동하고 있다. 특히 빅데이터 시대에 와서는 특정 형태의 데이터를 추출하고 사용가능하게 변형하는 것이 중요하게 되어, 정규표현식을 통계분야에서도 많이 활용하게 되었다.

구성요소

정규표현식의 구성요소는 일반 문자열과 형태를 지정하는 특수문자, 그리고 이를 구조화하는 대괄호, 중괄호, 소괄호로 이루어져 있다. 각 프로그래밍 언어와 텍스트 에디터마다 정규표현식의 문법이 미세하게 다르기 때문에, 여기서는 POSIX를 기준으로 설명한다.

문자열

정규표현식에서는 특수문자, 대괄호, 중괄호, 소괄호 등을 제외한 나머지를 문자열로 인식한다. 즉 특수문자를 제외한 영어와 한글, 한자 등의 모든 문자와 숫자이다. 단, 영어 등 서구권 언어의 경우에는 대문자와 소문자를 구별한다. 그러나 텍스트 에디터에 따라서는 대소문자 구별 기능을 끌 수도 있다.

원래 정규표현식은 한글, 한자 등의 인코딩이 없던 1970년대에 만들어졌기 때문에 특정 프로그래밍 언어나 텍스트 에디터에서는 인식이 안되거나, 입력한 글자와 실제 문서의 인코딩이 달라 정규표현식이 오작동하는 경우가 있었다. 특히 EUC-KR 인코딩과 유니코드간의 호환이 안되면 정규표현식이 작동하지 않았다. 한자의 경우에는 이 문제 외에도 유니코드에서의 한중일 통합한자 문제가 있다.

특수문자

특수문자에는 기호로 이루어진 메타 문자(MetaCharacter)와 이스케이프 문자로 나누어진다. 메타 문자는 정규표현식에서 특수한 기능을 수행한다. 본래 대괄호, 중괄호, 소괄호도 메타 문자에 속하지만 여기에서는 별도로 분리하였다.

이스케이프 문자는 메타 문자 중 백슬래쉬(\)[1]와 영어소문자의 결합형태로 표현되며 대부분 공백, 줄바꿈, 문자, 숫자, 백스페이스 등의 문자클래스를 의미한다.

대괄호: 문자 클래스의 집합

문자 클래스란 문자열, 특수문자 등을 등장할 수 있는 형태를 표시한 것이다. 그 집합은 대괄호로 표시하며, 중간에 - 를 통하여 이어지는 것을 의미하게 할 수 있다.

  • [0-9]는 0부터 9까지의 숫자 집합을 의미하며, [1358]은 숫자 1, 3, 5, 8만의 숫자집합을 의미한다.
  • [A-Z]는 영어 대문자 집합을 의미하며, [AEIOUaeiou]는 영어에서 a, e, i, o, u로 이루어진 대소문자 집합을 의미한다.
  • [가-힣]은 가부터 힣까지의, 한글자모부분을 제외한 한글 집합을 의미한다.

POSIX 문법에서는 [: :]의 형태로 된 것이 있는데, 이스케이프 문자와 동일한 기능을 수행한다.

중괄호: 수량자

수량자란 수량자 앞의 글자 혹은 문자클래스 집합의 글자수가 얼마나 되는지를 지정하는 것이다. 수량자는 중괄호로 표시하며, 중간에 , 를 통하여 최소수량과 최대수량을 지정할 수 있다. 수량자를 의미하는 특수문자로 ?, +, * 가 있다.

  • [0-9]{5} 는 5자리의 숫자 집합을 의미한다.
  • [A-Za-z]{3,} 는 3글자 이상의 영어 단어 집합을 의미한다.
  • [A-Za-z0-9]{4,8} 는 4글자 이상 8글자 이하의 영어 대소문자와 숫자로 이루어진 집합을 의미한다.
특수문자 대응수량자 설명
? {0,1} 문자가 없거나 하나인 경우
* {0,} 문자가 없거나 하나 이상 존재하는 경우
+ {1,} 문자가 하나 이상 존재하는 경우

수량자를 지정하지 않은 집합은 기본적으로 그 수량을 1로 이해하게 된다.

최대수량이 정해지지 않은 수량자 뒤에 특수문자 ?를 사용하면 게으른 수량자(Lazy quantification)라고 하여, 정규표현식을 충족가능한 작은 여러 개의 덩어리 형태를 찾게 된다. 게으른 수량자 ? 가 없다면 그 수량자는 탐욕적(Greedy)이라 하여 가능한 한 큰 덩어리로 만들게 된다.

  • .+ 은 한 줄을 의미하지만, 게으른 수량자를 이용해 .+?로 찾으면 .와 동일한 결과를 가져온다.
  • .{3,}은 3글자 이상의 한 줄을 찾지만, 게으른 수량자를 이용해 .{3,}?로 찾으면 한 줄을 3글자 단위로 끊은 결과를 보여준다.

소괄호: 하위 표현식

하위 표현식(subexpression; 서브 표현식)이란 정규표현식 내에서 특정 부분을 그룹으로 묶어 지정하는 것을 의미한다. 소괄호로 표시하며, 중간에 | 를 사용하여 또는을 의미하게 한다. 하위 표현식이 사용되면 소괄호 내에 있는 형태는 괄호별로 숫자가 순서대로 부여된다. 하위 표현식을 마치 프로그래밍 언어의 변수처럼 \1, \2[2]순으로 참조하게 되는데, 이를 역참조(Backreference)라고 한다.

예제문단
충청남도를 충청남도라고 한다. 옳다.
충청북도를 충청남도라고 한다. 잘못되었다.
충청도를 충청남도라고 한다. 역시 잘못되었다.
  • 충청(남|북)?도 는 충청남도, 충청북도, 충청도를 표시한다.
  • (충청(남|북)?도)는 \1 는 위에서 찾은 단어들을 하위 표현식으로 묶어서 역참조에 활용한 것이다. 이 경우 첫째 줄부분만이 검색된다.

한편 소괄호가 (?(1)참|거짓)형태로 ?가 사용되었을 경우에는 조건문 형태로 쓰인 것으로 조건이 참인 경우와 거짓인 경우를 나누어서 지정할 수 있다.

예제문단
000-0000-0000
(000)0000-0000
  • [math]\displaystyle{ (\()?\d\{3\}(?(1)\)|-)\d\{4\}-\d\{4\} }[/math] 로 찾으면 역참조에 의하여 ( 이 있는 부분은 )가, (이 없는 부분은 -로 대체되어 두 줄이 모두 검색된다.

기타

사용예시

관련항목

각주

  1. 1970년대부터 2000년대 초반까지의 UNIXMS-DOS 등의 DOS환경에서는 ESC 키를 누르면 백슬래쉬가 입력되며 한 줄 내려가기 때문에 이스케이프 문자라고 한다.
  2. Perl 스타일은 $1, $2 순으로 가며, 각 프로그래밍 언어별로 역참조는 다르게 표현된다.