정규 표현식 엔진에서는 선택(|)이 나타나면 주어진 순서에 따라
왼쪽에서 오른쪽으로 체크합니다.
예제 1
[^(Subject|Date):]
위 정규식은 문자열 첫 부분(^)에서 'Subject'나 'Date'를 찾습니다.
여기서 시도는 왼쪽에 있는 'Subject'를 확인한 후 매치가 되면
정규표현식의 나머지 부분(:)을 확인합니다.
만약 이 부분이 매치되지 않을 경우(문자열이 'Subject;'인 경우)
백트래킹을 하여 'Date'를 확인합니다.
예제 2
문자열 : "Jan 30 is NoSyu's birthday!"
정규식1: s/Jan (0?[1-9]|[12][0-9]|3[01])/Oct 31/
정규식2: s/Jan ([12][0-9]|3[01]|0?[1-9])/Oct 31/
위 문자열은 틀린 문장입니다.
NoSyu의 생일은 Oct 31이기에
Jan 30을 찾아 Oct 31으로 바꿔야합니다.
숫자는 한 달에 나올 수 있는 숫자를 찾도록 되어있습니다.
정규식1과 정규식2는 안의 내용은 같지만 순서가 다릅니다.
순서에 상관없이 작동한다면 둘의 결과는 같아야하지만,
서로 다른 결과물을 내놓습니다.

정규식1이 매치가 제대로 되지 않았습니다.
이 이유는 처음에 나오는 '0?[1-9]'때문입니다.
0은 없어도 되기에 [1-9]가 'Jan 30'의 3에 매치가 되고
그 뒤에 표현식이 없기에 매치가 끝납니다.
따라서 'Jan 3'을 'Oct 31'로 바꾸었기에 틀린 결과물이 나옵니다.
그렇기에 정규식2에서는 짧은 텍스트에 매치될 수 있는 것을 뒤로 보내어
올바른 결과물을 도출하였습니다.
정규식2 외에도 'Jan (31|[123]0|[012]?[1-9])'도 가능합니다.
또, 'Jan (0[1-9]|[12][0-9]?|3[01]?|[4-9])'는 순서에 상관이 없이 매치됩니다.
참조
정규 표현식 완전 해부와 실습 Page 253~256
- Windows(윈도우)에서 Perl module(CPAN) 설치법 (2)2009/01/12
- UTF8 Perl 소스, 명령 프롬프트(cmd.exe)에서 한... (2)2009/01/10
- C에서 가변 배열(Variable-Length Array) (8)2008/03/22
- 정규표현식 |은 순서대로 매치 (2)2007/11/28
- 정규표현식 룩어라운드(lookaround) (3)2007/11/26
- UTF8 Perl 소스, 명령 프롬프트(cmd.exe)에서 한... (7)2007/09/29
- 이글루 백업 프로그램 - 배포는 어떻게 하지? (10)2007/09/29
글에 잘못된 점, 다른 점, 부족한 점이 있다면 지적해주세요.
댓글, 트랙백, 메일 모두 고맙습니다.







댓글을 달아 주세요
음~ 정규식 보다는 은근슬쩍 생일 광고를 하는 듯한 느낌이... ^^ 뭐~ 지나간지 얼마 안되었으니 다시 올려면 멀었네요. 하하하하하
/codebook/
책에서 예제로 'Jan 31'이 나왔습니다.
30, 31에서 문제가 발생하여 조금 수정을 해야하는데,
마침 제 생일과 관계가 있어 적었습니다.^^
생일이 다시 오면... 기부해야죠.^^
(이제 선물은...OTL....)