在为此答案运行一些测试时,我注意到以下意外行为。这将删除第一个之后的所有出现<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>
所以这让我想到……
在 .NET 正则表达式引擎中,反向引用是否需要出现在它所引用的组之后?或者这些模式是否有其他原因导致它们不起作用?