PHP 정규식에서 탐욕성 제한
정규 표현식은 기본적으로 탐욕적(greedy)입니다. 이는 최대한 많은 문자를 잡아내려 한다는 것을 의미합니다.
예를 들어 살펴보겠습니다. 다음과 같은 문자열이 있다고 가정합시다:
<?php
$str = 'aeeex zzz x kkk';
?>
이 문자열에서 문자 'a', 그 다음 임의의 문자가 한 번 이상 나오고, 그 다음 문자 'x'라는 패턴으로 부분 문자열
'aeeex'를 찾고 싶다고 합시다.
<?php
$res = preg_replace('#a.+x#', '!', $str);
?>
결과 변수에 '! zzz x kkk' 문자열이 기록될 것으로 기대합니다. 그러나 실제로는 '! kkk' 문자열이 들어갑니다.
문제는 우리의 정규식이 문자 'a'부터 문자 'x'까지 모든 문자를 찾는다는 데 있습니다.
하지만 우리 문자열에는 'x' 문자가 두 개 있습니다. 탐욕성 때문에 정규식은 마지막 x까지 찾게 되어, 우리가 기대한 것과 다른 부분을 잡아냅니다.
물론, 종종 이런 동작이 우리에게 필요합니다. 그러나 이 특정한 경우에는 탐욕성을 취소하고 정규식이 첫 번째 x까지만 찾도록 하고 싶습니다.
탐욕성을 제한하려면, 반복 연산자 뒤에 물음표를 붙이면 됩니다:
<?php
$res = preg_replace('#a.+?x#', '!', $str);
?>
탐욕성은 모든 반복 연산자에 대해 제한할 수 있습니다. 다음과 같이: *?, ?? 그리고 {}?.
다음 문자열이 주어졌습니다:
<?php
$str = 'aba accca azzza wwwwa';
?>
양쪽 끝에 문자 'a'가 있는 모든 문자열을 찾고, 각각을 '!'로 바꾸는 정규식을 작성하세요. 문자 a 사이에는 ('a'를 제외한) 임의의 문자가 있을 수 있습니다.