.NET 版本之间的正则表达式匹配不同

6

我在使用 .netstandard2.0.net6.0 运行以下示例时得到不同的正则表达式匹配结果。

代码

var stringToMatch = "sydney bogota berlin tokyo nairobi denver rio";
Console.WriteLine($"Input: {stringToMatch}");

var reg = new System.Text.RegularExpressions.Regex(@"(\b(?!bogo|nai)\w*\b)\w+");

Console.WriteLine($"Output:");
foreach (var match in reg.Matches(stringToMatch))
{
    Console.WriteLine(match);
}

csproj-netstandard2.0

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFrameworks>netstandard2.0</TargetFrameworks>
    <ImplicitUsings>enable</ImplicitUsings>
    <LangVersion>latest</LangVersion>
  </PropertyGroup>
</Project>

csproj-net6

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFrameworks>net6.0</TargetFrameworks>
    <ImplicitUsings>enable</ImplicitUsings>
    <LangVersion>latest</LangVersion>
  </PropertyGroup>
</Project>

输出 - netstandard2.0 和 net472

返回匹配项

Input: sydney bogota berlin tokyo nairobi denver rio
Output:
sydney
berlin
tokyo
denver
rio

输出 - net5.0和net6.0

没有返回任何匹配项。

Input: sydney bogota berlin tokyo nairobi denver rio
Output:

https://regex101.com/r/Xn7X3w/1


2
我会在有时间的时候尝试调查这个问题,但看起来.NET 6.0中的正则表达式引擎在\w+回溯后无法识别匹配。顺便提一下,一个可以重现此问题的较短模式是\w*\b\w+ - 41686d6564 stands w. Palestine
2
奇怪的是,\b\S*\b\S+ 很好用。所以,它可能与回溯无关,而与 \w 有关。 - 41686d6564 stands w. Palestine
1
@JvdV 是的,我的意思是它不仅仅是一个回溯问题(在一般意义上);否则,我们应该看到与\S相同的行为。它肯定与回溯有关(特别是在单词边界锚点之后)。我测试了一些其他替代方案,[^\W]*(应该与\w*相同)可以正常工作。\ba*\ba不匹配"a",但如果您用[a-z]替换第一个a,它就可以正常工作。这非常奇怪。有人应该向Microsoft提交错误报告。 - 41686d6564 stands w. Palestine
1
@41686d6564standsw.Palestine 不仅仅是 \w*。尝试使用 123 456 789 进行 \d*\b\d+\d*?\b\d+。非常奇怪。啊,基本上与您之前的评论相同 =) - JvdV
1
@dhilmathy Python运行正常,你错过了原始字符串字面值前缀。 - Wiktor Stribiżew
显示剩余6条评论
1个回答

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接