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
,