정규식 (Regular Expression) 1) 기본문법
일전의 링크에서 [정규식 개론] 정규식이 무엇이고, 왜 정규식을 배워야하는지에 간단하게 설명하였습니다.
이번 글에서는 정규식의 표현 방법. 즉, 정규식 문법에 대해 알아보도록 하겠습니다.
다음과 같은 순서로 글을 전개하도록 하겠습니다.
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개의 댓글