正则表达式强制执行至少两个组中的一个

时间:2018-01-14 12:16:07

标签: regex go string-parsing

我必须使用正则表达式解析字符串,其中至少需要一组中的一个组。我无法弄清楚如何写这个案例。

为了说明问题,我们可以考虑解析这种情况:

String: aredhouse theball bluegreencar the
Match:  ✓         ✓       ✓            ✗
  1. 项目以空格分隔
  2. 每个项目由文章,颜色和由以下表达式中的组定义的对象组成(?P<article>the|a)?(?P<colour>(red|green|blue|yellow)*)(?P<object>car|ball|house)?\s*

  3. 项目可以包含“文章”,但必须具有“颜色”或/和“对象”。

  4. 有没有办法让“文章”可选,但需要使用正则表达式至少有一个“颜色”或“对象”?

    Here是此示例的编码Go版本,但我想这是适用于任何语言的通用正则表达式问题。

2 个答案:

答案 0 :(得分:3)

这适用于您的测试用例。

/
    (?P<article>the|a)?                         # optional article
    (?:                                         # non-capture group, mandatory
        (?P<colour>(?:red|green|blue|yellow)+)  # 1 or more colors  
        (?P<object>car|ball|house)              # followed by 1 object
        |                                       # OR
        (?P<colour>(?:red|green|blue|yellow)+)  # 1 or more colors
        |                                       # OR
        (?P<object>car|ball|house)              # 1 object
    )                                           # end group
/x        

可以简化为:

/
    (?P<article>the|a)?                         # optional article
    (?:                                         # non-capture group, mandatory
        (?P<colour>(?:red|green|blue|yellow)+)  # 1 or more colors  
        (?P<object>car|ball|house)?             # followed by optional object
        |                                       # OR
        (?P<object>car|ball|house)              # 1 object
    )                                           # end group
/x                                                                                    

答案 1 :(得分:0)

在正则表达式中,有一些特殊符号表示字符或组的预期匹配数:

* - 零或更多

+ - 一个或多个

? - 零或一个

这些应用,你的正则表达式如下:

(?P<article>(the|a)?)(?P<colour>(red|green|blue|yellow)+)(?P<object>(car|ball|house)+)\s*
  1. 无或一篇文章。
  2. 一种或多种颜色。
  3. 最后一个或多个对象。