我有这样的事情:
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/