2008년 08월 27일
정규표현식 - 매칭 범위를 최소한으로 잡아보자
[ 상황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
by -A2- | 2008/08/27 11:38 | 개발/플밍 | 트랙백 | 덧글(12)
트랙백 주소 : http://ani2life.egloos.com/tb/3880463
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by 명이 at 2008/08/27 12:01
별나라 언어로 보이는 1인..@_@

맛있는 점심 드셔용~^*^
Commented by -A2- at 2008/08/27 13:18
외계인과 통신중입니다. ㅋ
Commented by 자그니 at 2008/08/27 13:13
한국말로 써주세요...(응?)
Commented by -A2- at 2008/08/27 13:18
마음으로 읽어주세요. ^^
Commented by 키아 at 2008/08/27 16:29
빙글~뱅글~
Commented by -A2- at 2008/08/27 22:40
세상은 요지경~
Commented by 정태영 at 2008/08/27 17:44
명확하게 하려면 #[^#]+# 식으로 사용하는 것이 더 좋지 않을까요? :)
Commented by -A2- at 2008/08/27 22:51
네, 위와 같은 한가지 상황에서는 #[^#]+#도 문제없이 동작합니다.
그런데 #x!aa!z!bb!y# #x!cc!x!dd!y# !xxx!와 같은 ##사이의 !!사이를 가져오는 한가지 이상의 복잡하게 중첩된 상황에서 유용합니다.
최근 이런 중첩된 상황을 겪었거든요. ^^
Commented by 퓨이 at 2008/08/28 01:44
신기해라 신기해라~~~ +_+
오늘은 배가 안고파졌어요- 다행이에요 ^ㅇ^ ㅋㅋㅋ
Commented by -A2- at 2008/08/28 08:22
다이어트 하시는 분들을 위해 식욕 억제 포스팅을 했어요. ㅋ
Commented by phice at 2008/09/02 11:46
저는 컴맹이라 역시 이런 글 봐도 강건너 불구경 와하하하
#^!$.+# 는 말도 안되는 거였겠죠 당연히? 우와 역시 너무 어렵습니다 정규식은.
Commented by fancyydk at 2008/11/20 13:38
정규식은 항상 외우기 힘들고 귀찮아서 쓸때마다 책과 인터넷을 뒤져야 한다는 ㅠㅠ
위와 같은 상황에는 A2님의 블로그를 오면 되겠군요? ^^

:         :

:

비공개 덧글



<< 이전 페이지 | 다음 페이지 >>