.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