-6ren">
gpt4 book ai didi

c# - 反向引用是否需要在它们引用的组之后?

转载 作者:太空狗 更新时间:2023-10-30 01:20:40 26 4
gpt4 key购买 nike

在为 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>

所以这让我开始思考......

在 .NET 正则表达式引擎中,反向引用是否需要出现在它引用的组之后?或者这些模式是否有其他原因导致它们不起作用?

最佳答案

你的问题也让我思考,所以我用 RegexBuddy 进行了一些测试令我惊讶的是第二个正则表达式 (?<=\1.*)(<[^>]+>)你说没用的实际上有用,其他的和你说的完全一样。然后我在 C# 代码中尝试了相同的表达式 - 第二个 - 但它没有像您身上发生的那样工作。

这让我感到困惑,然后我注意到我的 RegexBuddy 版本可以追溯到 2008 年,所以 .NET 引擎的工作方式肯定有一些变化,但这揭示了一个我认为是合理的事实,似乎在 2008 年之前,lookbehinds 在表达式的其余部分匹配后进行评估。我觉得这种行为对于 lookbehinds 来说是可以接受的,因为你需要先匹配一些东西,然后再向后看以匹配它之前的东西。

然而,现在的引擎似乎在遇到它们时会评估环视,我能够通过使用以下表达式找到它,这就像你的情况相反:

(?<=(\w))\1

如您所见,我在正则表达式中捕获了一个单词字符并在其外部引用了它。我在字符串 hello 上测试了这个它在第二个 l 匹配符合预期的字符,这证明在尝试匹配表达式的其余部分之前执行了回溯。

结论:是的,反向引用需要出现在它引用的组之后,否则将没有匹配的语义。

关于c# - 反向引用是否需要在它们引用的组之后?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18344034/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com