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

标签 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。

更多说明:

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

最佳答案

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

要使第二部分可选,可以使用可选的非捕获组(?:...)?
没有所有捕获组的示例:

^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?匹配可选的空白字符char
  • (?:非捕获组
  • (?:foo|bar|baz)(?:\s?test)?匹配例如bar等和可选测试
  • |
  • test(?:\s?(?:foo|bar|baz))?匹配测试以及可选的foo,bar等
  • )关闭非捕获组
  • )?关闭非捕获组并将整个部分设为可选
  • $字符串结尾

  • Regex demo

    关于regex - 在Golang中以任何顺序匹配正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58237638/

    相关文章:

    c# - 用正则表达式替换字符串

    sql - 每行的正则表达式的匹配计数

    c# - 希腊字符、正则表达式和 C#

    python - 无法跨 Python 验证 RSASSA-PSS 签名 -> Go

    generics - 使两个相似的函数通用

    Golang channel 问题

    正则表达式:匹配模式但排除一种情况

    正则表达式匹配多个负前瞻

    c# - 正则表达式捕获可变长度的重复模式

    除任何数字外的正则表达式匹配