为什么正则表达式找不到匹配项

Why regexp does not find match

提问人:Andrus 提问时间:5/17/2023 最后编辑:VLAZAndrus 更新时间:5/17/2023 访问量:37

问:

法典

var tekst = "Sum km-ta 20% _48,15";
var rida = Regex.Match(tekst, @"(?si)Sum(_)?(\skm-ta)?(\s)?(20%)?(:)?(\s)?(_)?(?<kmta>.*?)\s", RegexOptions.Singleline);

找不到数学。看起来正则表达式是正确的,但由于未知原因,找不到总和。 如何获得匹配 48,15 ?

在 .NET 7 中使用 C#

C# 正则表达式 字符串匹配

评论

1赞 VLAZ 5/17/2023
"看起来 RegExp 是正确的,但由于未知原因没有找到 sum。Regex101 表示您的模式与数字不匹配,也没有捕获“总和”。
0赞 Andrus 5/17/2023
为什么 Regex101 说 Group kmta 是空的?它必须匹配 48,15
0赞 VLAZ 5/17/2023
我不知道,但这表明模式不正确。
0赞 VLAZ 5/17/2023
这是因为您使指定的捕获组变得懒惰。所以空火柴满足了它。
0赞 Andrus 5/17/2023
我在您的链接中没有看到此建议。哪里有这样的建议?

答:

1赞 Guru Stron 5/17/2023 #1

问题是组是懒惰的,所以空匹配很好。您可以尝试限制组内允许的内容并消除懒惰,字符串末尾也没有不可见的字符 - :kmta(?si)Sum(_)?(\skm-ta)?(\s)?(20%)?(:)?(\s)?(_)?(?<kmta>[\d,\.]*)(\s)?

var tekst = "Sum km-ta 20% _48,15";
var rida = Regex.Match(tekst, @"(?si)Sum(_)?(\skm-ta)?(\s)?(20%)?(:)?(\s)?(_)?(?<kmta>[\d,\.]*)(\s)?", RegexOptions.Singleline);
var ridaGroup = rida.Groups["kmta"].Value; // 48,15

此外,您可以删除懒惰并使可选:\s(?si)Sum(_)?(\skm-ta)?(\s)?(20%)?(:)?(\s)?(_)?(?<kmta>.*)\s?

评论

0赞 Guru Stron 5/17/2023
@Andrus它可以依赖于框架。我使用了 .NET 7,它找到了匹配项 - 演示
0赞 Andrus 5/18/2023
实际上,字符串是字符串的一部分。我添加了 * . 来开始和结束模式。(?si).*Sum()?(\skm-ta)?(\s)?(20%)?(:)?(\s)?()?(?<kmta>[\d,\.]*)(\s)?。* 这样可以吗?
0赞 Guru Stron 5/18/2023
@Andrus很难说。如果没有看到至少一些输入可变性,就很难判断应该使用哪种模式。