Javascript 为什么正则表达式中的**返回未定义
至少在Javascript中,在Chrome和Node.js上都进行了测试: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
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
^^^^^^^^^^^^^^^^^^