为什么惰性量词后面跟着问号会变得贪婪?

Why do lazy quantifiers become greedy when followed by a question mark?

为什么 "hello".match(/^(.*?)?/)[0] 的计算结果为 "h" 而不是 ""

换句话说,为什么在带有零或一量词 ? 的惰性表达式 (.*?) 之后会变得有点贪婪?

并不是内量词变得贪心,而是它尽量避免匹配一个完全的段。这就是为什么 .* 仍然只匹配第一个字符,而不是整个单词。

这是 JavaScript 正则表达式的一个奇怪之处。带有贪婪量词的空匹配部分的处理方式与其他常见的正则表达式引擎略有不同。其真正原因错综复杂。参见:Greediness behaving differently in JavaScript?

一种解决方法是使外部量词也变得惰性,并带有一个额外的问号:

"hello".match(/^(.*?)??/)[0] // output: ""