我希望在我的正则表达式中有两个可选部分 - 它们中的任何一个都可以在匹配的字符串中找到,并且它们也可以同时存在。
这两个可选部分都包含一个通配符(我在这里写了.*
但可以说是[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")
但我想避免重复。
答案 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));