正则表达式在两组中至少执行一个

Regular expression enforcing at least one in two groups

我必须使用正则表达式解析一个字符串,其中至少需要一组两个中的一个。我不知道怎么写这个案例。

为了说明问题我们可以考虑解析这个案例:

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. 一个项目可以有 'article' 但必须有 'colour' or/and 和 'object'.

有没有一种方法可以使 'article' 可选,但至少需要一个 'colour' 或 'object' 使用正则表达式?

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

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

* - 零个或多个

+ - 一个或多个

? - 零个或一个

这些已应用,您的正则表达式如下所示:

(?P<article>(the|a)?)(?P<colour>(red|green|blue|yellow)+)(?P<object>(car|ball|house)+)\s*
  1. None 或一篇文章。
  2. 一种或多种颜色。
  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