为什么Regex.Match在结果中包含非捕获组?

Sys*_*Lol 0 .net c# regex

在匹配正则表达式时,我想从结果中排除非捕获组.我错误地认为他们被默认排除在外,因为他们被称为非捕获组.

但是出于某种原因,Regex.Match表现得好像我甚至没有指定一个非捕获组.尝试在立即窗口中运行它:

System.Text.RegularExpressions.Regex.Match("b3a",@"(?:\d)\w").Value
Run Code Online (Sandbox Code Playgroud)

我期待结果

"a"
Run Code Online (Sandbox Code Playgroud)

但实际上

"3a"
Run Code Online (Sandbox Code Playgroud)

这个问题建议我查看各组,但结果中只有一个组,它也是"3a".它包含一个Capture,也就是"3a".

这里发生了什么?Regex是否有问题,或者我需要设置一个选项吗?

Bol*_*ock 8

匹配与捕获不同.(?:\d)简单地表示匹配包含\d但不打扰将其放入捕获组的子模式.你的整个模式(?:\d)\w寻找a (?:\d)后跟a \w; 它在功能上等同于\d\w.

如果你\w只想在a之前匹配a ,那么\d使用lookbehind断言:

System.Text.RegularExpressions.Regex.Match("b3a", @"(?<=\d)\w").Value
Run Code Online (Sandbox Code Playgroud)

  • 或`@"\ d(\ w)"`并根据需要使用组.我发现更容易阅读(虽然它可能更慢,不知道) (3认同)