在运行这个答案的一些测试时,我注意到以下意外的行为。这将在第一个出现后删除所有<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正则表达式引擎中,反向引用需要出现在其引用的组之后吗?或者这些模式中还有其他导致它们无法工作的问题?