2

다음 일반 표현식과 제목 텍스트가 주어지면 왜 부정적인 미리보기는 명명 된 캡처 그룹 URL의 마지막 문자에만 적용됩니까?전체 캡쳐 그룹에 어떻게 negative lookahead를 적용 할 수 있습니까?

// Regex 
(?<URL>(?<Protocol>\w+):\/\/(?<Domain>[\[email protected]][\w.:@]+)\/?[\w\.?=%&=\[email protected]/$,]*)(?!'|"|(</a)) 

// Subject text 
<p><a href="http://example.com">http://example.com</a> and http://example.com</p> 

이 정규식은 <a> 태그 내에있는 URL을 일치하지 시도하는 부정적 예측 (?!"|(</a)) 있습니다. URL 끝에 따옴표 (' 또는 ") 또는 닫는 </a 태그가 오는 지 확인하면됩니다.

나는 다음과 같은 결과

http://example.co 
http://example.co 
http://example.com 

받고 있어요 나는 부정적 예측이 아니라 그것은 마지막 문자의 전체 캡처 그룹에 적용 할 것으로 예상. 이것이 가능한가? 내가 도대체 ​​뭘 잘못하고있는 겁니까? 캡쳐 할 http://example.com의 마지막 인스턴스 만 일치 할 것으로 예상됩니다.

답변

2

부정적인 lookahead가 실패 할 때 한정사 (및 다른 모든 것)가 일치 할 때까지 역 추적 할 것이기 때문에.

당신은 atomic groups (?>expression) 사용하여 역 추적하지 않는 식을 강제 할 수

:

(?<URL>(?>(?<Protocol>\w+):\/\/(?<Domain>[\[email protected]][\w.:@]+)\/?[\w\.?=%&=\[email protected]/$,]*))(?!'|"|(</a))