Regex 正则表达式在两个组中至少强制一个

Regex 正则表达式在两个组中至少强制一个,regex,go,string-parsing,Regex,Go,String Parsing,我必须使用正则表达式解析字符串,其中至少需要两个组中的一个组。我想不出怎么写这个案子 为了说明问题,我们可以考虑解析此案例: String: aredhouse theball bluegreencar the Match: ✓ ✓ ✓ ✗ 项目之间用空格分隔 每个项目由一个物品、一种颜色和一个物体组成,由以下表达式中的组定义(?P是本例的编码Go版本,但我猜这是适用于任何语言的通用regexp问题。在regex中,有几个特殊符号表示字符或组

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

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

String: aredhouse theball bluegreencar the
Match:  ✓         ✓       ✓            ✗
  • 项目之间用空格分隔

  • 每个项目由一个物品、一种颜色和一个物体组成,由以下表达式中的组定义
    (?P是本例的编码Go版本,但我猜这是适用于任何语言的通用regexp问题。

    在regex中,有几个特殊符号表示字符或组的预期匹配数:

    *
    -零或更多

    +
    -一个或多个

    -零或一

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

    (?P<article>(the|a)?)(?P<colour>(red|green|blue|yellow)+)(?P<object>(car|ball|house)+)\s*
    
    (?P(a))(?P(红|绿|蓝|黄)+)(?P(车|球|屋)+)\s*
    
  • 没有或只有一篇文章
  • 一种或多种颜色
  • 最后是一个或多个对象

  • 这将与您的测试用例一起工作

    /
        (?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|a)?#可选条款
    (?:#非捕获组,必填
    (?P(?:红色|绿色|蓝色|黄色)+1种或更多颜色
    (?Pcar | ball | house)#后跟1个对象
    |#或
    (?P(?:红色|绿色|蓝色|黄色)+1种或更多颜色
    |#或
    (?Pcar | ball | house)1个对象
    )#终端组
    /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                                                                                    
    
    /
    (?p|a)?#可选条款
    (?:#非捕获组,必填
    (?P(?:红色|绿色|蓝色|黄色)+1种或更多颜色
    (?Pcar | ball | house)?#后跟可选对象
    |#或
    (?Pcar | ball | house)1个对象
    )#终端组
    /x
    
    感谢您的回答。可能我没有正确解释,但我不希望单个“article”或空格匹配。但此regexp没有回答原始问题:将“article”设置为可选,但至少需要一个“color”或“object”。但此regexp没有回答原始问题:将“article”设置为可选le‘可选,但至少需要一种‘颜色’或‘对象’。@MonkeyButter啊,我想我把你的问题搞错了。我想你至少需要一种颜色或对象。