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

Javascript 带有两个可选(?)正则表达式部分的通配符(*),javascript,regex,Javascript,Regex,我想在我的正则表达式中有两个可选部分——它们中的任何一个都可以在匹配的字符串中找到,而且两个都可以同时找到 这两个可选部分都由一个通配符组成(我在这里写了*,但可以说是[a-zA-Z]+;无论如何,关键是如果应用了贪婪匹配,正则表达式的第二部分(Bar)与通配符匹配) Firebug输出最好地说明了这一点: >>/(Foo.*)(Bar.*)/.exec(“FooAA”) [“FooAA”,“FooAA”,未定义]//确定 >>>/(Foo.*)(Bar.*)/.exec(“BarAA”) [“

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

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

Firebug输出最好地说明了这一点:

>>/(Foo.*)(Bar.*)/.exec(“FooAA”)
[“FooAA”,“FooAA”,未定义]//确定
>>>/(Foo.*)(Bar.*)/.exec(“BarAA”)
[“BarAA”,未定义,“BarAA”]//确定
>>>/(Foo.*)(Bar.*)/.exec(“FooAABarAA”)
[“FooAABarAA”,“FooAABarAA”,未定义]//我想要[“FooAABarAA”,“FooAA”,“BarAA”]
有没有办法构造一个与上面三个测试用例相匹配的正则表达式

我可以用像这样的东西

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

但是我想避免重复。

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

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

您只需将第一个通配符设置为非贪婪,如下所示:

/(Foo.*?)?(Bar.*)?/
您可以使用以下选项:

 /((?:Foo|Bar)[\s\S]*?)(?=Foo|Bar|$)/
(确保在下一次出现之前具有尽可能大的子字符串)

例如:

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

嗯,我试过了,但是没有前导
^
和尾随
$
,它不起作用(返回
[“Foo”,“Foo”,未定义]
)。很好用。谢谢实际上,您给了保持尾随的
$
(但可以去掉
^
)。但是,既然你最终捕捉到了所有的字符,它还是有意义的。不,不起作用:
/(Foo.*?)(Bar.*)/.exec(“FooAABarAA”)
->
[“Foo”,“Foo”,未定义]
。参见Agares的答案。
/((?:Foo | Bar)[/s/s]*?)(?=Foo | Bar |$)/.exec(“FooAABarAA”)->
null