我有这样的东西:
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和其他选项。
答案 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等)
关闭非捕获组)?
关闭非捕获组并将整个部分设为可选$
字符串结尾