.NET 5 中的 C# RegEx 行为与其他版本不同

Posted

技术标签:

【中文标题】.NET 5 中的 C# RegEx 行为与其他版本不同【英文标题】:C# RegEx behaviour different in .NET 5 than other versions 【发布时间】:2022-01-13 07:54:11 【问题描述】:

谁能向我解释以下内容?我正在使用正则表达式来验证十六进制颜色(也可以包含 alpha 分量)。我使用的代码如下;

new Regex("^(?:[0-9a-fA-F]3,4)1,2$").IsMatch(str)

我已经在各种正则表达式测试站点和 .NET Fiddle(见下文)上测试了我的表达式,并且它有效

https://dotnetfiddle.net/W33vbL

然而,在我们的应用程序(.NET Core 5)上运行服务器端却失败了。如果我附加到该进程,我会看到以下错误;

如果我将表达式粘贴在监视窗口中,我会看到以下内容;

相同的表达式适用于 .NET 3.1 和 6,但不适用于 .NET 5。

【问题讨论】:

只是为了确保:试试.IsMatch(Regex.Replace(str, @"[^a-fA-F0-9]+", "")) 好吧,我没想到会看到任何我预期的不可见/不可打印字符与匹配问题。当代码和正则表达式都很好时,问题总是在数据中。 好的,谢谢 Lasse。这是有道理的。 (我刚刚在 LINQPad 中进行了测试,我可以选择在 .NET 3.1、5 或 6 上运行。它适用于 3.1 和 6,但不适用于 5。我认为这是一个错误,也许你应该提出问题GitHub 上的微软?) 不需要char数组,我基本上只是输入new Regex("^(?:[0-9a-fA-F]3,4)1,2$").IsMatch("8DB3E2"),它在.NET Core 3.1和.NET 6中返回true,但在.NET 5中返回false。是的,我确实输入了,我没有复制和粘贴,所以我确定我在模式或输入中没有隐藏或不可见或其他奇怪的字符。 似乎缺少一些回溯,如果我通过在 3,4 后面添加一个问号使其非贪婪,则该模式也适用于 .NET 5。 【参考方案1】:

根据有用的 cmets,这看起来像是 .NET 5 的错误;见下文

https://github.com/dotnet/runtime/issues/56721

【讨论】:

请在发布问题后添加指向该问题的链接,这样未来的访问者,如果他们在修复此错误之前(假设会)也能找到该问题。

以上是关于.NET 5 中的 C# RegEx 行为与其他版本不同的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 .NET C# regex 或其他任何方法提取 *>...* 之间的文本字符串?

与 C# 控制台应用程序中的相同代码相比,Regex.Match 在 Unity 中返回不同/错误的结果

C# 应用程序与 C++ 和 VB.Net 中的其他应用程序之间的 IPC

C# (.net) RegEx.Match 换行符之间的子字符串 - 使用换行符作为正向超前限制

.NET 单元测试的艺术&单元测试之道C#版

如何使用 DataAnnotations & Regex - c# - ASP.NET Core