为什么正则表达式中的*。*返回undefined

时间:2016-02-28 18:31:03

标签: javascript regex

至少,在Javascript中,在Chrome和Node.js上进行了测试:

new RegExp(/foo(optional)*boo/).exec('foooptionalboo')

将与括号中的optional匹配:

[ 'foooptionalboo',
'optional',
index: 0,
input: 'foooptionalboo' ]

但是如果你想在optional

之间有某些东西
new RegExp(/foo.*(optional)*.*boo/).exec('foooptionalboo')

然后找不到optional

[ 'foooptionalboo',
'optional',
index: 0,
input: 'foooptionalboo' ]

为什么会这样?

2 个答案:

答案 0 :(得分:5)

.*有机会之前optional匹配(optional)*

让它变得非贪婪(使用?),这样如果跟随它的东西就不会匹配。

/foo.*?(optional)*.*boo/.exec("foooptionalboo")

答案 1 :(得分:2)

Quentin的答案问题是,.*?后跟可选的贪婪子模式(optional)? 贪婪点匹配模式.*适用于这种方式.*?只匹配空字符串,.*占用字符串的其余部分。

为什么会发生这种情况?因为懒的子模式可以匹配一个空字符串(并且它总是匹配,因为它可以匹配一个空字符串),所以:一旦lazy子模式匹配,其他子模式尝试向右,如果找到匹配,则不重新尝试延迟子模式。 enter image description here

要真正抓取可选部件,请使用特定模式,在可选部件后面不显示.*,或者(使其更通用)使用tempered greedy token

foo(?:(?!optional).)*(optional)*.*boo
   ^^^^^^^^^^^^^^^^^^

请参阅regex demo

(?:(?!optional).)*是调和的贪婪令牌,匹配任何文本,直到第一个optional子字符串。