【问题标题】:Non-capturing group not working in Regex非捕获组不在正则表达式中工作
【发布时间】:2023-03-10 13:57:01
【问题描述】:

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

January 25
Jan 25

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

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

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

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

【问题讨论】:

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

标签: .net regex


【解决方案1】:

您的捕获组应该只围绕Jan

(?<M>Jan)(?:uary)? (?<D>\d{1,2})

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

【讨论】:

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

试试:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    相关资源
    最近更新 更多