정규식 (Regular Expression) 1) 기본문법

글쓴이 Engineer Myoa 날짜

일전의 링크에서 [정규식 개론]  정규식이 무엇이고, 왜 정규식을 배워야하는지에 간단하게 설명하였습니다.

이번 글에서는 정규식의 표현 방법. 즉, 정규식 문법에 대해 알아보도록 하겠습니다.

 

다음과 같은 순서로 글을 전개하도록 하겠습니다.

1. 기본문법

2. 상세 풀이 및 용법


1. 기본문법

정규식 문법에는 여러 종류의 표현 방식과 연산자가 존재합니다. 크게 몇가지로 구분해보자면

메타문자 정규식에서 사용되는 일반적인 특수기호입니다.
문자클래스

(이스케이핑 문자집합)

이 표현이 정확한 표현은 아닌것 같은데, 저는 이렇게 부릅니다.

메타문자의 ‘ \ ‘를 붙여 사용할 수 있는 문자 클래스입니다.

수량자 반복되는 패턴에 대하여 정의합니다.
역참조, 전후방탐색 검색 후 문자열 변경 혹은 탐색의 우선순위를 지정합니다.
Flag 정규식 적용범위 혹은 Case Sensitive등의 옵션을 지정합니다.

1) 메타문자

\ 이스케이핑 문자 (KRW의 ‘원’표시와도 같음)

문자 본래의 의미를 잃고, 다른 용도로 쓰기 위해 사용합니다.

^ 식을 찾는 범위를 문자열의 처음으로 제한합니다. $와 같이 사용할 수 있습니다.
$ 식을 찾는 범위를 문자열의 마지막으로 제한합니다. ^와 같이 사용할 수 있습니다.
. 아무개 문자를 의미합니다. 정규식에서의 wildcard character입니다.
[ ] 문자집합을 의미합니다. 대괄호 안에 들어있는 문자혹은 문자 범위만을 포함시킵니다.
[^ ] 문자집합내의 ^는 ! 혹은 NOT을 의미합니다.  [ ]와는 반대로 동작합니다.
범위를 의미합니다. 문자집합내에서 사용됩니다. ex) [A-Z]
| OR를 의미합니다. 여러 OR조건을 이어붙여 사용할 수 있습니다.
   

 

2) 이스케이핑 문자집합 (Escaped Meta Character)

\d 정수를 검색합니다. ( [0-9]와 같음. )
\D \d의 역을 검색합니다.
\w 문자를 검색합니다. 숫자도 검색에 포함합니다.

한글은 유니코드이므로 검색되지 않습니다. ( [a-zA-Z0-9]와 같음. )

\W \w의 역을 검색합니다.
\s 공백 ( 탭문자, 공백문자, 개행문자 )을 검색합니다.
\S \s의 역을 검색합니다.
\n 줄바꿈(new line) 문자를 검색합니다.
\t 탭 문자를 검색합니다.
\b 문자의 경계를 검색합니다.
\B \b의 역을 검색합니다.

 

3) 수량자

탐욕적 수량자 반복되는 문자를 검색할 때 최대한 많은 양을 묶습니다.
* 0개 이상 일치하는 문자를 검색합니다. ( {0,} ) 과 같음
+ 1개 이상 일치하는 문자를 검색합니다. ( {1,} ) 과 같음
? 문자 1개가 있거나 없음을 검색합니다.
{i,j} i이상 j이하 횟수만큼 일치하는 문자를 검색합니다.
{i} i번 일치하는 문자를 검색합니다.
{i,} i번 이상 일치하는 문자를 검색합니다.
게으른 수량자 반복되는 문자를 검색할 때 최소한의 양만을 묶습니다.
*?, +?, {m,}? 수량자에 ?가 붙으면 최소한의 갯수로 일치하는 문자를 검색합니다.

 

4) 역참조, 전후방탐색

( ) 서브셋. 하위 표현식을 정의합니다. group을 만들 거나 분기를 둘 때 주로 사용됩니다.
\1, \2, \3 하위 표현식으로 묶은 서브셋을 접근할 때 사용합니다.

\0은 널을 의미하므로 인덱스는 1부터 시작합니다.

?= 전방탐색의 긍정형. 주어진 문자의 앞에서부터 찾는다.
?<= 후방탐색의 긍정형. 주어진 문자의 뒤에서부터 찾는다.
?! 전방탐색의 부정형. 주어진 문자가 있
?<! 후방탐색의 부정형

전후방 탐색의 부정형은 잘 사용하지는 않지만 차이는 이해하는것이 좋습니다.

그렇구나~ 정도로만 생각하시고 넘어가셔도 좋습니다

다음과 같은 식은 어떻게 동작할까요?

(?<!ABC)[a-z. ]+(?!ABC)

우선 가운데에 [a-z. ] 이 있는것으로 보아 소문자와 마침표, 공백을 포함하는 문자를 1개이상 매치하는 식으로 보입니다. (문자 집합내의 마침표는 와일드 카드 문자가 아닌,  마침표 문자를 의미합니다.)

meet the world는 소문자와 공백 조합의 문자열이기 때문에 [a-z. ]에 매치됩니다.

두 번째 문장은 이상없이 잘 매치된것에 비해

첫 번째 문장은 eet the worl 만 매치가 됩니다.

왜냐하면

후방탐색의 부정형 [a-z. ] 전방탐색의 부정형이므로

 

(?<!ABC)에 의해

ABC뒤에 [a-z. ] 문자가 포함되면 안되고,

(?!ABC)에 의해

ABC앞에 [a-z. ] 문자가 포함되면 안되기 떄문입니다.

 

 

5) Flag

가장 대표적인 플래그로는 g,i,m 3개가 있습니다.

dotall, extended, Ungreedy같은 경우 잘 사용되지 않고 일반식으로 충분히 커버가 가능하기 때문입니다. 

//g (global search) 전역에서 매치되는 값을 찾습니다. 기본 설정값입니다. 옵션을 끄게 되면 일치하는 한 그룹만을 검색합니다.
//i (ignore case, case insensitive) 대소문자를 구별하지 않습니다.
//m (multiline) 정규식의 ^, $는 기본적으로 가장 첫문장의 첫 인덱스와, 가장 마지막 문장의 마지막 인덱스를 의미합니다.

만약 multiline 모드가 켜져있다면 ^,$는 각 문장의 첫, 마지막 인덱스를 의미하게됩니다.

//s (dotall) “.” 이 \n문자까지 포함하도록 합니다.
//x (extended) 공백은 특수문자로 인식되어 실제 공백을 입력하기 위해서는 \로 이스케이핑 해주어야합니다.

/a   b   c   d/x 는 abcdefghi를 매치시킬 수 있습니다.

//U (ungreedy) 정규식은 탐욕적 수량자를 기본값으로 검색합니다. ?없이 자동적으로 게으른 수량자로 검색하기 위해 사용합니다.

 

 

2. 상세풀이 및 용법

이렇게 쓰다보니 글이 너무 길어졌네요. 

여기서 글을 끊고 숨 한번 돌릴 여유를 갖도록 하겠습니다.

2부에서 만날게요.

 

 

참고문헌

위키피디아 – 정규 표현식

https://ko.wikipedia.org/wiki/%EC%A0%95%EA%B7%9C_%ED%91%9C%ED%98%84%EC%8B%9D

 

PHP: 정규 표현식 상세

http://ir2.php.net/manual/kr/regexp.reference.php

 

정규표현식(Regular Expressions) 문법

http://mindgear.tistory.com/194

 

RegExp 정규식 Flag 플래그

http://dol2156.tistory.com/228

카테고리: 강의

6개의 댓글

답글 남기기

Avatar placeholder

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다