Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么Regex.Match在结果中包含非捕获组?_C#_.net_Regex - Fatal编程技术网

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

C# 为什么Regex.Match在结果中包含非捕获组?,c#,.net,regex,C#,.net,Regex,在匹配正则表达式时,我想从结果中排除。我错误地认为它们会被默认排除,因为它们被称为非捕获组 但出于某种原因,Regex.Match的行为就好像我甚至没有指定非捕获组一样。尝试在即时窗口中运行此命令: System.Text.RegularExpressions.Regex.Match("b3a",@"(?:\d)\w").Value 我原以为结果会很好 "a" 但事实上 "3a" 建议我看一下分组,但结果中只有一个分组,也是“3a”。它包含一个捕获,也是“3a” 这是怎么回事?正则表达式是

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

但出于某种原因,Regex.Match的行为就好像我甚至没有指定非捕获组一样。尝试在即时窗口中运行此命令:

System.Text.RegularExpressions.Regex.Match("b3a",@"(?:\d)\w").Value
我原以为结果会很好

"a"
但事实上

"3a"
建议我看一下分组,但结果中只有一个分组,也是“3a”。它包含一个捕获,也是“3a”


这是怎么回事?正则表达式是否有错误,或者是否需要设置一个选项?

非捕获组表示它不构成组。匹配字符串包含在结果字符串中

如果要排除该部分,请使用类似lookbehind断言的方法

@"(?<=\d)\w"

@”(?非捕获组表示它不构成组。匹配字符串包含在结果字符串中

如果要排除该部分,请使用类似lookbehind断言的方法

@"(?<=\d)\w"

@”(?匹配与捕获不同。
(?:\d)
只是指匹配包含
\d
的子模式,但不要麻烦将其放入捕获组。您的整个模式
(?:\d)\w
查找一个
(?:\d)
后跟一个
\w
;它在功能上等同于
\d\w

如果仅当前面有
\d
时才尝试匹配
\w
,请改用查找断言:

System.Text.RegularExpressions.Regex.Match("b3a", @"(?<=\d)\w").Value

System.Text.RegularExpressions.Regex.Match(“b3a”,@”(匹配与捕获不同。
(?:\d)
只是指匹配包含
\d
的子模式,但不要麻烦将其放入捕获组中。您的整个模式
(?:\d)\w
查找
(?:\d)
后跟一个
\w
;它在功能上等同于
\d\w

如果仅当前面有
\d
时才尝试匹配
\w
,请改用查找断言:

System.Text.RegularExpressions.Regex.Match("b3a", @"(?<=\d)\w").Value

System.Text.RegularExpressions.Regex.Match(“b3a”,@”(?您误解了非捕获组的用途

通常,组(由一对括号定义)(
)意味着两件事:

  • 所包含的正则表达式是分组的,因此括号后的任何量词都应用于整个表达式,而不仅仅是前一个字符
  • 与组匹配的子字符串将作为子类别存储在属性中
有时,您不希望某些组得到第二个结果,这就是引入非捕获组的原因:它们允许您对子表达式进行分组,而无需将其任何匹配项存储在
groups
属性的项中

您已经注意到,您的
Groups
属性包含一个项,但是-这是正确的,默认情况下,第一个组始终是完整表达式的捕获。cf.在文档中:

如果正则表达式引擎可以找到匹配项,则Groups属性返回的GroupCollection对象的第一个元素包含与整个正则表达式模式匹配的字符串


通过将要捕获的字符串放入一个组中,您仍然可以使用组来实现您想要的:

\d(\w)
(我再次省略了非捕获组,因为它不会改变上述表达式中的任何内容。)

使用此修改的表达式,匹配项中的
属性应包含两项:

  • 完全匹配(属于
    \d\w
  • 仅上面字符串中您似乎感兴趣的部分,由
    \w

  • 你误解了非捕获组的目的

    通常,组(由一对括号定义)(
    )意味着两件事:

    • 所包含的正则表达式是分组的,因此括号后的任何量词都应用于整个表达式,而不仅仅是前一个字符
    • 与组匹配的子字符串将作为子类别存储在属性中
    有时,您不希望某些组得到第二个结果,这就是引入非捕获组的原因:它们允许您对子表达式进行分组,而无需将其任何匹配项存储在
    groups
    属性的项中

    您已经注意到,您的
    Groups
    属性包含一个项,但是-这是正确的,默认情况下,第一个组始终是完整表达式的捕获。cf.在文档中:

    如果正则表达式引擎可以找到匹配项,则Groups属性返回的GroupCollection对象的第一个元素包含与整个正则表达式模式匹配的字符串


    通过将要捕获的字符串放入一个组中,您仍然可以使用组来实现您想要的:

    \d(\w)
    
    (我再次省略了非捕获组,因为它不会改变上述表达式中的任何内容。)

    使用此修改的表达式,匹配项中的
    属性应包含两项:

  • 完全匹配(属于
    \d\w
  • 仅上面字符串中您似乎感兴趣的部分,由
    \w
  • 或者
    @“\d(\w)”
    并根据需要使用组。我发现这更容易阅读(虽然可能较慢,不知道),或者
    @“\d(\w)”
    并根据需要使用组。我发现这更容易阅读(虽然可能较慢,不知道)