我试图弄清楚为什么当“单行”选项打开时,具有负面前瞻性的正则表达式会失败。
示例(简化):
<source>Test 1</source>
<source>Test 2</source>
<target>Result 2</target>
<source>Test 3</source>
这个:
<source>(?!.*<source>)(.*?)</source>(?!\s*<target)
如果打开单行选项将失败,如果关闭单行选项将工作。例如,这有效(禁用单行选项):
(?-s:<source>(?!.*<source>)(.*?)</source>(?!\s*<target))
我的理解是单行模式只允许点“.”匹配新行,我不明白为什么它会影响上面的表达式。
谁能解释一下我在这里缺少什么?
::::::::::::::::::::::::
编辑:(?!.*) 是一个负面展望,而不是一个捕获组。
<source>(?!.*?<source>)(.*?)</source>(?!\s*<target)
如果单行模式打开,也会失败,所以看起来这不是一个贪婪的问题。在正则表达式设计器(如 Expresso 或 Rad 正则表达式)中尝试:
单行关闭时,它匹配(如预期):
<source>Test 1</source>
<source>Test 3</source>
打开单行:
<source>Test 3</source>
我不明白为什么它也不匹配第一个:它不包含第一个否定的前瞻性,所以它应该匹配表达式。
请您参考如下方法:
我相信这就是您要找的:
<source>((?:(?!</?source>).)*)</source>(?!\s*<target)
想法是一次匹配每个字符,但前提是要确保它不是 </source> 的第一个字符。 .另外,加上 /?对于前瞻性,您不必使用非贪婪量词。
