在Golang中以任何顺序匹配正则表达式

时间:2019-10-04 13:42:56

标签: regex go regex-lookarounds

我有这样的东西:

option name [p1|p2|p3] | [p4]

其中选项名称是必填项。 选项必须完全匹配,而名称则对任何ASCII字符有效。如果匹配,则这两个后面的任何字符串都是可选的,并且可以按任何顺序出现。因此,它应该匹配:

option name1 p1
option name1 p1 p4
option name1 p4 p1

我的正则表达式尝试:

^(option)\s+(([a-zA-Z0-9]+))\s?(((p1|p2|p3)?)\s?((p4))?)\s?$

如果按特定顺序提供了可选的字符串,例如:

option name1 p1 p4
option name1
option name1 p1
option name1 p4

但是这个不起作用:

option name1 p4 p1

是否可以编写正则表达式来支持这些可选字符串的任何顺序?

修改: p1,p2,p3,p4仅作为示例。它可以是任何提供的确切字符串,例如foo,bar,baz。

更多说明:

name可以是任何字符串。在理想情况下,它应该不同于foo,bar,baz和其他选项。

1 个答案:

答案 0 :(得分:1)

如果要同时匹配两个变体,则可以使用或|列出两个变体。

要将第二部分设为可选,可以使用可选的非捕获组(?:...)?

没有所有捕获组的示例:

^option\s+[a-zA-Z0-9]+(?:\s?(?:(?:foo|bar|baz)(?:\s?test)?|test(?:\s?(?:foo|bar|baz))?))?$

部分看起来像

  • ^字符串的开头
  • option\s+[a-zA-Z0-9]+匹配选项,1 +个空格字符和a +字符a-zA-Z或数字0-9
  • (?:非捕获组
    • \s?匹配可选的空白字符
    • (?:非捕获组
      • (?:foo|bar|baz)(?:\s?test)?匹配例如条形图和可选测试
      • |
      • test(?:\s?(?:foo|bar|baz))?匹配测试以及可选的foo,bar等
    • )关闭非捕获组
  • )?关闭非捕获组并将整个部分设为可选
  • $字符串结尾

Regex demo