Regex 在Golang中按任意顺序匹配正则表达式

Regex 在Golang中按任意顺序匹配正则表达式,regex,go,regex-lookarounds,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))?

我有这样的想法:

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))?))?$
在某些方面,它看起来像

^字符串开头 选项\s+[a-zA-Z0-9]+匹配选项,1+空格字符和a+字符a-zA-Z或数字0-9 ?:非捕获组 \s?匹配可选空白字符 ?:非捕获组 ?:foo | bar | baz?:\s?测试?匹配,例如,棒等和可选测试 |或 测试?:\s???:foo | bar | baz?匹配测试和可选的foo、bar等 关闭非捕获组 ? 关闭非捕获组并使整个部分成为可选部分 $字符串结尾
谢谢你的回答。对不起,让人误解的问题是:p1、p2、p3只是示例。在我的场景中,它应该匹配不同的字符串,例如foo baz bar。为什么在问题和正则表达式中使用p?在这种情况下,您必须列出所有选项,而不是字符类,但仍然使用交替部分来匹配左侧和右侧中的一个,或者反之亦然。我试图简化它。因为我不是正则表达式专家,所以我忽略了这种可能性。我会更新我的问题。@coder你的意思是这样吗?非常感谢您的解释:不能再投票两次:那么名称1和p1的区别是什么?你有白名单吗?选项p1会发生什么情况?选项jhfgudfbs4^%*$有效吗?它应该失败。选项和名称是必需的。之后的其他选项应该完全匹配,正如我在问题中所写的那样。我会更新我的问题,所以它是清楚的。它仍然是不清楚的。您可以声明,尽管名称有效,但任何ASCII字符组合都有效。p1是一个ASCII字符组合。您的意思是指定名称后面必须跟一个数字吗?