【问题标题】:How to optionally match a group?如何有选择地匹配一个组?
【发布时间】:2016-10-03 19:55:02
【问题描述】:

我有两种可能的模式:

1.2 hello
1.2.3 hello

我想匹配123 如果后者存在

Optional items 似乎是要走的路,但我的 pattern (\d)\.(\d)?(\.(\d)).hello 只匹配 1.2.3 hello (几乎完美:我得到了四个组,但第一、第二和第四组包含我想要的) - 第一个测试字符串根本不匹配。

什么是正确的匹配模式?

【问题讨论】:

    标签: regex


    【解决方案1】:

    您的模式包含匹配数字的 (\d)\.(\d)?(\.(\d)) 部分,然后是 .,然后是可选数字(可能是 1 或 0),然后是 . + 数字。因此,它可以匹配1..2 hello,但不能匹配1.2 hello

    您可以将第三组设为非捕获并将其设为可选:

    (\d)\.(\d)(?:\.(\d))?\s*hello
              ^^^      ^^
    

    regex demo

    如果您的正则表达式引擎不允许非捕获组,请使用捕获组,只是您必须从第 4 组中获取值:

    (\d)\.(\d)(\.(\d))?\s*hello
    

    this regex

    请注意,我将 hello 之前的 . 替换为 \s* 以匹配零个或多个空格。

    另请注意,如果您需要在行首匹配这些数字,您可以考虑在模式前面加上^(并且取决于您的正则表达式引擎/工具,m 修饰符)。

    【讨论】:

      猜你喜欢
      • 2018-03-19
      • 2011-02-21
      • 2018-12-14
      • 2013-09-02
      • 1970-01-01
      • 2012-03-19
      • 2014-04-24
      • 2021-04-11
      • 1970-01-01
      相关资源
      最近更新 更多