79

我正在使用这个正则表达式:

((?:[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
4

2 回答 2

146

制作一个非捕获的零到更多匹配组,您必须附加?.

(?: ..... )?
^          ^____ optional
|____ group
于 2019-12-18T11:44:48.567 回答
77

您可以轻松地将您的正则表达式简化为:

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

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

正则表达式101演示

如您所见,第二场比赛中的匹配组1是空的,并且从匹配组2开始。

于 2013-09-05T10:08:23.137 回答