한발자국 더 나가보자.
데이타 bc bd abc abd abf
정규표현식 [ab](?(?<=a)bc|d)
캡쳐그룹이 없어졌고 조건식만 있는 타입이다.
(?(조건식)예|아니오) 구문에서
조건식이 참이라면 [예]가 매치되고 거짓이라면 [아니오]가 매치된다.
(조건식)이 그룹을 지정표시하던 (1) 에서 (?<=a)로 바뀐것 뿐이다.
후방참조이고 의미는 현재위치에서 왼쪽으로 가서 a를 찾아라는 뜻이다.
이어보면
현재위치에서 왼쪽으로가서 a를 찾아봐서 a가 있으면 bc를 선택하고 a가 없으면 d를 선택하라 이다.
[ab]는 a 또는 b 이니까
[ab](?(?<=a)bc|d)의 전체의미는 abc 또는 bd 가 된다. (abc|bd)와 같다.
perl 에서 돌려보면
use 5.010;
@data = qw(bc bd abc abd abf);
$regex = qr/[ab](?(?<=a)bc|d)/;
for(@data){
say $_ if /$regex/;
}
결과값
bd
abc
abd
마지막의 abd 는 bd가 매치된 결과로 같이 나타난것이다.
물론 ^를 사용해서 검색에서 제외할 수 있다.
$regex = qr/^[ab](?(?<=a)bc|d)/;
덧글