非捕获组不在正则表达式中工作

Posted

技术标签:

【中文标题】非捕获组不在正则表达式中工作【英文标题】:Non-capturing group not working in Regex 【发布时间】:2012-09-06 06:34:07 【问题描述】:

使用正则表达式,我想匹配以下字符串:

January 25
Jan 25

我正在分别捕获月份和日期部分,但如果有完整的月份名称,我只想返回月份名称的前 3 个字符,所以我使用非捕获组 (?:) 来表示字符“uary”:

(?<M>(Jan(?:uary)?)) (?<D>\d\d)

不幸的是,M 组总是返回完整的月份名称;即它也捕获非捕获组。

我已经打开了 ExplicitCapture 标志。我已经使用过 RegExBuilder 和 Rad Software 的正则表达式设计器来确保它不是因为该工具。

【问题讨论】:

哪种语言?正则表达式有几种不同的风格,不同的宿主语言使用不同的风格。 这是 .NET Fx。 (如果重要,则为 4.0)。 【参考方案1】:

您的捕获组应该只围绕Jan

(?<M>Jan)(?:uary)? (?<D>\d1,2)

你原来的表达方式大致相当于(?&lt;M&gt;January|Jan) (?&lt;D&gt;\d\d)。非捕获组并不意味着从现有捕获组中删除匹配项。这只是意味着没有创建新的捕获组。

【讨论】:

感谢马克的快速、准确和信息丰富。这个解释和你的回答一样有用。 我看到的唯一问题是它只有在一天中有 2 位数字时才会匹配。最后一组应该是(?&lt;D&gt;\d1,2)【参考方案2】:

试试:

(?<M>Jan)(?:uary)? (?<D>\d\d)

【讨论】:

以上是关于非捕获组不在正则表达式中工作的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式 - 非捕获组返回所谓的非捕获组,,? [复制]

什么是正则表达式“独立非捕获组”?

正则表达式 1. 分组提取/非捕获组

为啥正则表达式可选非捕获组不作为可选并且搞砸匹配?

正则表达式中的非捕获组(non-capturing)的用法

正则表达式中的子组模式