至少,在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' ]
为什么会这样?
答案 0 :(得分:5)
在.*
有机会之前optional
匹配(optional)*
。
让它变得非贪婪(使用?
),这样如果跟随它的东西就不会匹配。
/foo.*?(optional)*.*boo/.exec("foooptionalboo")
答案 1 :(得分:2)
Quentin的答案问题是,.*?
后跟可选的贪婪子模式(optional)?
和贪婪点匹配模式.*
适用于这种方式.*?
只匹配空字符串,.*
占用字符串的其余部分。
为什么会发生这种情况?因为懒的子模式可以匹配一个空字符串(并且它总是匹配,因为它可以匹配一个空字符串),所以:一旦lazy子模式匹配,其他子模式尝试向右,如果找到匹配,则不重新尝试延迟子模式。
要真正抓取可选部件,请使用特定模式,在可选部件后面不显示.*
,或者(使其更通用)使用tempered greedy token:
foo(?:(?!optional).)*(optional)*.*boo
^^^^^^^^^^^^^^^^^^
请参阅regex demo
(?:(?!optional).)*
是调和的贪婪令牌,匹配任何文本,直到第一个optional
子字符串。