Javascript 为什么正则表达式中的**返回未定义

Javascript 为什么正则表达式中的**返回未定义,javascript,regex,Javascript,Regex,至少在Javascript中,在Chrome和Node.js上都进行了测试: new RegExp(/foo(optional)*boo/).exec('foooptionalboo') 将匹配括号中的可选: [ 'foooptionalboo', 'optional', index: 0, input: 'foooptionalboo' ] 但是,如果您希望在可选项之间有一些内容,请执行以下操作: new RegExp(/foo.*(optional)*.*boo/).exec('fooo

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

new RegExp(/foo(optional)*boo/).exec('foooptionalboo')
将匹配括号中的
可选

[ 'foooptionalboo',
'optional',
index: 0,
input: 'foooptionalboo' ]
但是,如果您希望在
可选项之间有一些内容,请执行以下操作:

new RegExp(/foo.*(optional)*.*boo/).exec('foooptionalboo')
然后找不到
可选的

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

这是为什么?

(可选)*
有机会之前,
*
匹配
可选的

使其非贪婪(使用
),这样,如果后面的内容匹配,则它将不匹配

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

昆汀回答的问题是,
*?
后面跟着一个可选的贪婪子模式
(可选)
贪婪点匹配模式
*
的工作方式是,
*?
只匹配空字符串,而
*
占据整个字符串的其余部分

为什么会发生这种情况?因为可以匹配空字符串的惰性子模式(因为它可以匹配空字符串,所以在这里它将始终匹配)的工作原理是:一旦惰性子模式匹配,将尝试右侧的其他子模式,如果找到匹配,则不会重新尝试惰性子模式。

要真正抓取可选部件,请使用在可选部件后不出现
*
的特定模式,或者(为了使其更通用)使用:


(?:(?!可选)。*
是匹配任何文本直到第一个
可选
子字符串的标记。

似乎适用于
fooooptionalboo
,但如果我真的想在单词之间允许字符,例如
fooooptionalboo
foo(?(?!可选)。*(可选)**boo
foo(?:(?!optional).)*(optional)*.*boo
   ^^^^^^^^^^^^^^^^^^