2016-10-03 42 views
1

我有两个可能的模式:如何可选地匹配一个组?

1.2 hello 
1.2.3 hello 

我想,如果后者存在匹配123

Optional items似乎是要走的路,但我pattern(\d)\.(\d)?(\.(\d)).hello比赛只1.2.3 hello(几乎是完美的:我得到四组,但第一,第二和第四包含我想要的) - 第一个测试蜇不匹配,在所有。

什么是正确的匹配模式?

回答

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修改器)预先处理该模式。