提问者:小点点

正则表达式可选组


我使用这个正则表达式:

((?:[a-z][a-z]+))_(\d+)_((?:[a-z][a-z]+)\d+)_(\d{13})

要匹配这样的字符串:

SH_6208069141055_BC000388_20110412101855

分为4组:

SH
6208069141055
BC000388
20110412101855

问:我如何使第一个组可选,使结果组是一个空字符串?
我想在每种情况下得到4组,如果可能的话。

这种情况下的输入字符串:(第一组后面没有下划线)

6208069141055_BC000388_20110412101855

共2个答案

匿名用户

要创建一个非捕获、零到多匹配组,必须附加

(?: ..... )?
^          ^____ optional
|____ group

匿名用户

您可以很容易地将正则表达式简化为:

(?:([a-z]{2,})_)?(\d+)_([a-z]{2,}\d+)_(\d+)$
^              ^^
|--------------||
| first group  ||- quantifier for 0 or 1 time (essentially making it optional) 

我不确定没有第一组的输入字符串是否会有下划线,但是如果是整个字符串,您可以使用上面的正则表达式。

regex101演示

如您所见,第二个匹配中匹配的组1为空,从匹配的组2开始。