【问题标题】:Regex optional group正则表达式可选组
【发布时间】:2013-09-09 02:40:11
【问题描述】:

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

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

【问题讨论】:

    标签: regex optional regex-group


    【解决方案1】:

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

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

    【讨论】:

    • 这个答案很有用,因为它可以更有效地帮助那些来到这里谷歌搜索Regex optional group的人,这是问题的主题。没有人想要来自外部站点的演示,每个人都想要直接的答案。 SO 更多的是帮助尽可能多的人,而不是抱怨突然间你的唯一完美答案面临危险。
    • 选项组和(...)*的区别是什么
    • @GoldenLion ? 匹配“零次或一次”,* 匹配“零次或多次”
    【解决方案2】:

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

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

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

    regex101 demo

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

    【讨论】:

    • 谢谢!我很难想出要搜索什么,才能找到这个问题!
    • 哪个字符将组标记为可选?
    • 第一组后面的??这是左起第 17 个字符。
    猜你喜欢
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    相关资源
    最近更新 更多