this answer에 대한 몇 가지 테스트를 실행하는 동안 다음과 같은 예기치 않은 동작이 나타났습니다. 이 첫 번째 후 <tag>
의 모든 항목을 제거합니다 :역 참조는 참조하는 그룹을 뒤따라야합니까?
var input = "<text><text>extra<words><text><words><something>";
Regex.Replace(input, @"(<[^>]+>)(?<=\1.*\1)", "");
// <text>extra<words><something>
하지만이되지 않습니다 마찬가지로
Regex.Replace(input, @"(?<=\1.*)(<[^>]+>)", "");
// <text><text>extra<words><text><words><something>
는, 이번이 마지막 이전 <tag>
의 모든 발행 수를 제거합니다 :
Regex.Replace(input, @"(<[^>]+>)(?=.*\1)", "");
// extra<text><words><something>
하지만 그렇지 않습니다.
Regex.Replace(input, @"(?=\1.*\1)(<[^>]+>)", "");
// <text><text>extra<words><text><words><something>
그래서이 생각이 나게 & hellip;
.NET 정규 표현식 엔진에서 참조하는 그룹 이후에 역 참조가 이어야합니까? 아니면 작동하지 않는 패턴이 계속 진행되고 있습니까?
논리적으로 말하자면, 먼저 뭔가를 캡처 한 다음 역 참조로 사용해야합니다. 그렇지 않으면 재귀 적 정규식 [this like this] (http://stackoverflow.com/questions/18262551/can-the-for-loop-be- PHP 코드 조각/18262967 # 18262967)이 실패합니다 :) PS : 그것은 넷뿐 아니라 모든 유형의 사례라고 생각합니다. 데모보기 [php pcre] (http://regex101.com/r/zR9jR2) – HamZa
@HamZa 감사합니다. 좋은 지적입니다. lookaround assertions *는 다른 것으로 생각했을 것입니다. 왜냐하면 (이해할 때) 문자열의 일치하는 섹션 다음에 평가되어야하기 때문입니다. 즉, 어설 션을 검사하기 전에 ''을 찾아야합니다. 그러나 정규 표현식의 내부에 대해 너무 많이 알지는 않습니다. 그래서 나는 틀릴 수도 있습니다.또한, 대부분의 경우 엔진의 동작이 패턴에 나타난 순서보다는 평가 된 순서에 의존하면 더 놀랄 것입니다. –