正则表达式可选组

joe*_*joe 28 regex optional regex-group

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

((?:[a-z][a-z]+))_(\d+)_((?:[a-z][a-z]+)\d+)_(\d{13})
Run Code Online (Sandbox Code Playgroud)

匹配这样的字符串:

SH_6208069141055_BC000388_20110412101855
Run Code Online (Sandbox Code Playgroud)

分为4组:

SH
6208069141055
BC000388
20110412101855
Run Code Online (Sandbox Code Playgroud)

问题:如何使第一组可选,以便生成的组是空字符串?
在可能的情况下,我想在每种情况下获得4组.

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

6208069141055_BC000388_20110412101855
Run Code Online (Sandbox Code Playgroud)

Dan*_* W. 98

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

(?: ..... )?
^          ^____ optional
|____ group
Run Code Online (Sandbox Code Playgroud)

  • 这个答案*更*有用,只是因为它可以更有效地帮助那些来这里谷歌搜索“正则表达式可选组”的人,这是问题的主题。没有人想要来自外部站点的演示,每个人都只想要简单的答案。SO更多的是帮助尽可能多的人,而不是抱怨突然间你唯一的完美答案面临危险。 (16认同)
  • 组开头的 ``?:``` 有什么作用? (6认同)
  • @brobers 普通组“(...)”将捕获结果中的内容,但“(?:...)”使其成为非捕获组,因此它必须匹配(或应用)但不会包含在结果组中。 (4认同)

Jer*_*rry 29

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

(?:([a-z]{2,})_)?(\d+)_([a-z]{2,}\d+)_(\d+)$
Run Code Online (Sandbox Code Playgroud)

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

regex101演示

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

  • 哪个字符将组标记为可选? (2认同)
  • 第一组后面的“?”?这是左起第 17 个字符。 (2认同)