带有两个可选(?)正则表达式部分的通配符(。*)

时间:2013-07-29 16:52:29

标签: javascript regex

我希望在我的正则表达式中有两个可选部分 - 它们中的任何一个都可以在匹配的字符串中找到,并且它们也可以同时存在。

这两个可选部分都包含一个通配符(我在这里写了.*但可以说是[a-zA-Z]+;无论如何,重点是正则表达式的第二部分(Bar)匹配如果应用贪婪匹配,则使用通配符。)

这个Firebug输出最能说明:

>>> /(Foo.*)?(Bar.*)?/.exec("FooAA")
["FooAA", "FooAA", undefined] // OK

>>> /(Foo.*)?(Bar.*)?/.exec("BarAA")
["BarAA", undefined, "BarAA"] // OK

>>> /(Foo.*)?(Bar.*)?/.exec("FooAABarAA")
["FooAABarAA", "FooAABarAA", undefined] // I'd like to have ["FooAABarAA", "FooAA", "BarAA"]

有没有办法构建一个匹配上面三个测试用例的正则表达式?

我可以使用......

/((Foo.*)(Bar.*))|(Foo.*)?(Bar.*)?/.exec("FooAABarAA")

但我想避免重复。

3 个答案:

答案 0 :(得分:4)

你需要非贪心的通配符。这对我有用:

/^(Foo.*?)?(Bar.*?)?$/

答案 1 :(得分:2)

你应该能够像这样制作第一个非贪婪的通配符:

/(Foo.*?)?(Bar.*)?/

答案 2 :(得分:0)

您可以使用:

 /((?:Foo|Bar)[\s\S]*?)(?=Foo|Bar|$)/

(确保在下一次出现之前有最大可能的子串)

示例:

console.log('FoodAABarAABarBBFoo'.match(/((?:Foo|Bar)[\s\S]*?)(?=Foo|Bar|$)/g));