2013-08-28 2 views
3

실패 패턴은 내가 정규식을 배우고 난 다음 패턴을 발견 : Q는 Q를 일치하기 때문에, 유 (그래서를 U 일치정규식 긍정적 예측 - 항상

q(?=u)i 

내가 수학 quit하려고하면 실패를 lookahead가 유효하다). 그러나 정규 표현식은 단어 quit에서 역 추적하고 문자 u는 i와 이번에 다시 비교된다. 경기가 실패합니다.

이 패턴과 일치하는 단어가 없습니다. 어떤 경우 있습니까? 아니면이 구조 (패턴 - 미리보기 - 나머지 패턴)가 유용합니까?

답변

2

아니, 예를 들어, (하지만 틀림없이 조금 이상한)이 당신은 내가 본 것을 언급 한 것과 유사한 일치 패턴은 없지만 이러한 구조를 사용할 수 있습니다

q(?=.*t)u 

이 정규식이 일치합니다 qu으로 시작하지만 임의의 문자열은 나중에 t입니다. 즉, question, quit은 일치하지만 quasar은 일치하지 않습니다. 이 경우, 동등하고 읽기 쉬운 (imo) 정규식 qu(?=.*t)을 사용할 수 있습니다.

3

정규식 둘러보기 구문은 zero width입니다.

  • q 일치 "Q"는 커서가 "U"
  • (?=u) 일치 "U"이동 :이 의미

    는 일치하지만 패턴 때문에, 커서를 이동하지 않는다는 것입니다 커서가 "u"에 머문 채

  • i은 "u"와 일치하지 않으므로 패턴이 실패합니다.

패턴 백 트랙이 아니며, lookaround 어설 션은 제로 폭입니다.

이 구조는 "적어도 하나 이상의 X"가 포함 된 패턴을 일련의 문자와 일치시키려는 경우 매우 유용합니다. 예를 들어 :

[a-z]{4}[1-9]{3}(?=.*X)[a-zA-Z]{5} 

는 적어도 하나의 "X"어떤 사건의 다섯 글자 다음에 세 자리 숫자 다음에 네 개의 소문자 말한다.

1

미리보기 앞 (또는 앞)의 패턴 ((?=...))이 수정되면 나는 말할 것입니다. 정규식은별로 의미가 없습니다. like :

foo(?=bar)fixed 

그러나 fixed 부분이 동적 인 경우 유용합니다. 이 예를 참조하십시오 :

kent$ echo "fooququuuxxxxxxx"|grep -Po 'q(?=uu).*' 
quuuxxxxxxx 

kent$ echo "fooququuuxxxxxxx"|grep -Po 'q(?=u).*' 
ququuuxxxxxxx 

위의 예에서, lookahead 만 다르면 일치하는 결과가 달라집니다.이 질문에 보리스 거미에 의해 응답에서 제시 한 사용 사례 구조를 적용 할

0

, 내가 정규식 엔진 내부의 모습을 촬영이 솔루션

$detail = '[code]<!doctype> 
<html> 
    <head></head> 
    <body><p>My Regex script</p></body> 
</html>[/code]'; 

function regex($detail) 
{ 
    if(preg_match('#^\[code](?=.*(<([A-Z][A-Z0-9]*)\b[^>]*>(.*?)</\2>))\[/code]#si', $detail)) 
    { 
     return true; 
    } 
    return false;   
} 
echo regex($detail); 

함께했다,이 일어나고있는 것입니다. 위의 $ detail에 ^\[q](?=.*(<([A-Z][A-Z0-9]*)\b[^>]*>(.*?)</\2>))[/q]*을 적용 할 때; \[q][q]과 일치하고 코드의 html 섹션은 (<([A-Z][A-Z0-9]*)\b[^>]*>(.*?)</\2>))과 일치합니다.

lookahead와의 일치가 취소되므로 엔진이 문자열의 [/ q]에서 코드의 html 섹션으로 되돌아갑니다. Lookahead가 성공적 이었으므로 엔진은 [/q]으로 계속됩니다. 그러나 [/q](<([A-Z][A-Z0-9]*)\b[^>]*>(.*?)</\2>))과 일치 할 수 없습니다. 따라서이 일치 시도는 실패합니다. 작동 synthax

그러나이 정규식 :

#^\[code](?=.*(<([A-Z][A-Z0-9]*)\b[^>]*>(.*?)</\2>\[/code]))#si 

정규식 엔진은 단순히 말한다 : "개방 모든 문자, 마지막에 적어도 닫는 [/code] 태그 HTML 태그의 다음 한 쌍의 다음 [code] 태그".

이 내용이 유스 케이스 패턴 일치 (종료)에 대해 설명하는 데 도움이되기를 바랍니다.

관련 문제