我必须使用正则表达式解析字符串,其中至少需要一组中的一个组。我无法弄清楚如何写这个案例。
为了说明问题,我们可以考虑解析这种情况:
String: aredhouse theball bluegreencar the
Match: ✓ ✓ ✓ ✗
每个项目由文章,颜色和由以下表达式中的组定义的对象组成(?P<article>the|a)?(?P<colour>(red|green|blue|yellow)*)(?P<object>car|ball|house)?\s*
项目可以包含“文章”,但必须具有“颜色”或/和“对象”。
有没有办法让“文章”可选,但需要使用正则表达式至少有一个“颜色”或“对象”?
Here是此示例的编码Go版本,但我想这是适用于任何语言的通用正则表达式问题。
答案 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*