[ 상황1 ]
문자열: "#aaa# xxx"
위와 같은 문자열이 있고 #으로 시작해서 #으로 끝나는 문자열을 추출하고 싶을 경우 아래와 같이 할 수 있습니다.
표현식: /#.+#/
매칭결과: "#aaa#"
[ 상황2 ]
문자열: "#aaa# #bbb# xxx"
이번에는 위와 같은 문자열 입니다.
원하는 결과는 "#aaa#", "#bbb#" 입니다.
그런데 상황1의 표현식을 쓰면 아래와 같은 결과가 나오게 됩니다.
표현식: /#.+#/
매칭결과: "#aaa# #bbb#"
[ 상황2의 이유 ]
정규표현식에서 +, *, ? 들은 욕심쟁이 입니다.
그래서 가능한 최대 범위로 매칭합니다.
최대 범위 매칭을 풀이하자면 상황2에서 경우의 수를 따져보면 아래와 같은 매칭들이 가능합니다.
"#aaa#", "#bbb#", "#aaa# #", "# #bbb#", "#aaa# #bbb#"
이중에서 가장 큰 범위의 "#aaa# #bbb#"가 선정되는 것이죠.
[ 상황2의 해결방법 ]
정규표현식에서 +, *, ? 들의 욕심을 최소화 시킬 수 있습니다.
아래와 같이 바꿔서 사용하면 됩니다.
+ 대신 +?
* 대신 *?
? 대신 ??
[ 상황2에 해결방법을 적용 ]
문자열: "#aaa# #bbb# xxx"
표현식: /#.+?#/
매칭결과: "#aaa#", "#bbb#"
이제 최소 범위로 매칭이 됩니다.
[ PHP 정규표현식에서 가능한 다른 해결방법 ]
PHP 정규표현식의 U 수정자를 이용하는 방법도 있습니다.
문자열: "#aaa# #bbb# xxx"
표현식: /#.+#/U
매칭결과: "#aaa#", "#bbb#"
PHP 정규표현식에서 U 수정자를 사용하면 표현식에 사용되는 모든 +, *, ? 이 모두 +?, *?, ?? 와 같이 동작합니다.
참고문서: http://www.skdevelopment.com/php-regular-expressions.php





최근 덧글