2

我想在我的正则表达式中有两个可选部分——它们中的任何一个都可以在匹配的字符串中找到,而且它们都可以同时出现。

这两个可选部分都包含一个通配符(我在.*这里写过,但可以说;无论如何,如果应用贪婪匹配[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"]

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

我可以使用 sth like

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

但我想避免重复。

4

3 回答 3

4

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

/^(Foo.*?)?(Bar.*?)?$/
于 2013-07-29T16:56:11.863 回答
2

您应该能够像这样使第一个通配符不贪婪:

/(Foo.*?)?(Bar.*)?/
于 2013-07-29T16:57:59.130 回答
0

你可以使用这个:

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

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

例子:

console.log('FoodAABarAABarBBFoo'.match(/((?:Foo|Bar)[\s\S]*?)(?=Foo|Bar|$)/g));
于 2013-07-29T17:03:02.360 回答