我在使用 .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:
\w+
回溯后无法识别匹配。顺便提一下,一个可以重现此问题的较短模式是\w*\b\w+
。 - 41686d6564 stands w. Palestine\b\S*\b\S+
很好用。所以,它可能与回溯无关,而与\w
有关。 - 41686d6564 stands w. Palestine\S
相同的行为。它肯定与回溯有关(特别是在单词边界锚点之后)。我测试了一些其他替代方案,[^\W]*
(应该与\w*
相同)可以正常工作。\ba*\ba
不匹配"a",但如果您用[a-z]
替换第一个a
,它就可以正常工作。这非常奇怪。有人应该向Microsoft提交错误报告。 - 41686d6564 stands w. Palestine\w*
。尝试使用123 456 789
进行\d*\b\d+
和\d*?\b\d+
。非常奇怪。啊,基本上与您之前的评论相同 =) - JvdV