2011-03-08 3 views
3

의 집합을 찾기 I이 예를 들어 다음과 같은 문자열 : 나는 문자열의 모든 XX.*YY.*ZZ 부분을 찾을 수있는 방법PHP 정규 표현식 (PCRE) - 모든 문자열

aaXXccYYeeXX_ZZkkYYmmXX_ZZnnXXooYYuuXX_ZZvv 

? CC YY

  • XX (아마도 preg_match() 사용) eeXX_ ZZ
  • XX _ ZZkk YY mmXX _ ZZ
  • XX _ ZZnnXXoo YY uuXX _ ZZ
  • XX OO YY uuXX_ ZZ

플러스 모든 이상 일치 :

  • XX CC YY eeXX_ZZkkYYmmXX_ZZnnXXooYYuuXX_ Z Z
+1

이전에 같은 문제가 발생했습니다. 문제는 겹쳐진 것들을 찾고자하는 것이지, 욕심이 많거나 욕심 거리지 않는 것들을 혼자서 찾아내는 것이 아닙니다. 나는 정규식 전문가가 아니야. – Jacob

+0

일치 패턴을 고안하기위한 [RegexBuddy 오픈 소스 대안] (http://stackoverflow.com/questions/89718/is-there-anything-like-regexbuddy-in-the-open-source-world)을 사용해보십시오. – mario

+0

이것은 다음 질문과 유사합니다 : http://stackoverflow.com/questions/5163933/#5164444,하지만 PCRE가 아니라 .Net을 사용하고있었습니다. – Kobi

답변

2

감사합니다.

내 솔루션은 'bobbogo'솔루션을 기반으로합니다. 고맙습니다.

정규 표현식 :

(?=(XX.*?YY.*?ZZ))(?=(.*ZZ)) 

결과 (RegexBuggy에서) : 더에 의해

1 XXccYYeeXX_ZZ  XXccYYeeXX_ZZkkYYmmXX_ZZnnXXooYYuuXX_ZZ 
2 XX_ZZkkYYmmXX_ZZ  XX_ZZkkYYmmXX_ZZnnXXooYYuuXX_ZZ 
3 XX_ZZnnXXooYYuuXX_ZZ XX_ZZnnXXooYYuuXX_ZZ 
4 XXooYYuuXX_ZZ  XXooYYuuXX_ZZ 

이 할 수있는 가능한 최적화? 나는 정규 표현식에서 큰 전문가가 아니다.

+0

듣기 좋게 듣습니다. 이 대답의 위쪽/아래쪽 화살표 옆에있는 짙은 체크 표시를 클릭하여 자신의 대답을 수락 할 수 있습니다. –

1

이것은 처음 보면 아주 솔직하게 보입니다.

XX(.*?)YY(.*)ZZ 

편집

아하 : 나는 별도의 일치를 제안 긴 경기

XX(.*?)YY(.*?)ZZ 

: 첫 번째의 경우, 반복 일치를 사용! 패턴이 겹칩니다 (감사합니다 여러분). 이 경우 반복해야합니다. 일치하는 항목을 다시 시도하기 전에 .*?XX의 앞부분을 제거하는 것이 가장 쉽습니다. 단일 정규식에 대한 필사적 인 경우 펄 땅에서 당신은 당신의 구조에 올 것이다 배열 맥락에서 다음 m//g,

while (/XX(.*?)YY(.*?)ZZ/) { 
    print "[$1] [$2]\n"; 
    s/^.*?XX//; 
} 

을 사용합니다. (해당 PHP가 어떻게 보이는지 확실하지.) 초기 XX이 벗겨과

@a = /XX(?=(.*?YY.*?ZZ))/g; 

배열 @a이 중복되는 문자열을 포함하는,하지만 것입니다.

+0

질문이 매우 혼란 스럽기 때문에 내 생각에 뭔가 빠져 있습니다. 예제의 첫 번째와 두 번째 결과가 겹칩니다. 'XXYYXX_ZZYYZZ'는 * 2 * results :'XXYYXX_ZZ'와'XX_ZZYYZZ'를 산출해야합니다. '(? = XX (. *?) YY (. *?) ZZ)'로 얻을 수는 있지만 가능한 모든 길이 또는 모든 가능성에 대해서는 얻을 수 없습니다. – Kobi