Skip to main content
 首页 » 编程设计

C# 正则表达式 : negative lookahead fails with the single line option

2024年02月24日39bonelee

我试图弄清楚为什么当“单行”选项打开时,具有负面前瞻性的正则表达式会失败。

示例(简化):

<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> 的第一个字符。 .另外,加上 /?对于前瞻性,您不必使用非贪婪量词。