非捕获组不在正则表达式中工作
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)
你原来的表达方式大致相当于(?<M>January|Jan) (?<D>\d\d)
。非捕获组并不意味着从现有捕获组中删除匹配项。这只是意味着没有创建新的捕获组。
【讨论】:
感谢马克的快速、准确和信息丰富。这个解释和你的回答一样有用。 我看到的唯一问题是它只有在一天中有 2 位数字时才会匹配。最后一组应该是(?<D>\d1,2)
【参考方案2】:
试试:
(?<M>Jan)(?:uary)? (?<D>\d\d)
【讨论】:
以上是关于非捕获组不在正则表达式中工作的主要内容,如果未能解决你的问题,请参考以下文章