提问人:Andrus 提问时间:5/17/2023 最后编辑:VLAZAndrus 更新时间:5/17/2023 访问量:37
为什么正则表达式找不到匹配项
Why regexp does not find match
问:
法典
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#
答:
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很难说。如果没有看到至少一些输入可变性,就很难判断应该使用哪种模式。
评论