2011-03-31 4 views
2

탐욕스러운 +을 사용하여 1 회 이상 일치하는 항목을 찾으려면 양수 차선 찾기를 어떻게 사용합니까?RegEx - 긍정적 인 Lookbehind 문제

(?<=\w)\w+ 

하지만 모든 \ w 유사한 일치해야합니다 :

이 작동

(?<=\w+)\w+ 

구문은 두 번째 예에서 잘못하고 그것이 작동하지 않습니다.

어떻게 여러 번 일치하는 긍정적 인 lookbehind를 만들 수 있습니까?

+2

실제로 무엇을하려고합니까? – Gumbo

+2

당신은 _ 가변 길이 lookbehind_에 대해 이야기하고 있습니다. 아주 몇몇 정규식 엔진이이를 지원합니다. .NET 및 JGSoft 엔진은 내가 알고있는 유일한 엔진입니다. 검보가 묻는 것을 반복 할 것입니다 ... 무엇을 맞추어야합니까? – ridgerunner

+0

코멘트 주셔서 감사합니다 - 나는 단 하나의 단어가 아닌 구문과 일치하는 태그 클라우드를 구축하려고합니다. 가변 길이 lookbehind는 전체 문자열에 걸쳐 다른 위치의 단어 문자열을 비교하는 것입니다. 지저분한 지 알고 있습니다. – Kit

답변

2

당신은 아마 사용 후 캡처 그룹을 어떤 lookbehinds없이 일치 할 :

if (preg_match('~[abc]+([cde]+)~', $string, $matches)) { 
    echo $matches[1]; // will contain the [cde]+ part 
} 
3

을 할 수있는 아주 더러운 방법은 문자열을 반대하고 대신에 긍정적 예측을 사용하는 것입니다. 이것은 내가 (더 lookbehinds가 지원되지 :() 자바 스크립트에서 사용하는 트릭이다 그래서 당신은 같은 것을해야

:. 본의 발생에 위의 코드는 일치합니다

$string = 'This is a long string that must show this is what will happen'; 
$str_rev = strrev($string); 

if (preg_match('!(si)(?=\w+)(\w+)!i', $str_rev, $matches)) { 
    print_r($matches); 
} 

입니다 + w \ 문자열. 두 번째 은 일치하고 예제에서 필요하지 않은 경우 보여주기 위해 단지이다.

이 기술은 당신이 greedines에 대해 하나 개의 방향을 사용하는 경우에만 가능하다는 것을 명심하십시오 Lookbehind/aheads (예 : \ w +와 함께 lookbehind를 사용할 수 없습니다. \ w +와 함께 lookahead와 함께 사용할 수 없습니다)

+0

매우 흥미 롭습니다. – sawa

2

죄송하지만, lookbehinds에 한정어가 없습니다!

나는 임의의 regexps '에 일치시킬 수 있습니다 (? = 정규 표현식)을 perlretut

내다이를 찾았지만 (? < = 고정 정규 표현식)에만 고정 폭

을의 regexps'에 작동을 을 lookbehind

나는 이것이 PHP regex 엔진에도 유효하다고 가정합니다.

관련 문제