对于正则表达式,通常希望使表达式的一部分不贪婪。为此,我们使用问号。
当用作更大表达式的一部分以捕获零个或多个字符时,(.*?)
和之间有什么区别?(.*)?
例如,会
(.*?)ng
产生与不同的结果吗(.*)?ng
?
最终结果相同(经https://regex101.com/),但是否存在不那么明显的差异呢?
答案1
正如所提到的我的其他答案,该.*?
版本是惰性的。这意味着它将使括号内的部分尽可能少地应用于正则表达式以进行匹配。括号外带有问号的版本是贪婪的:它将应用于尽可能多的字符。
如果您只考虑匹配与否,这两个表达式的效果相同。两个通配符运行都会得到匹配如果可能的话,但一个最小化捕获量,而另一个最大化捕获量。然而,它们在捕获的内容上有所不同。
让我们看一个捕获差异的例子: 。它包含两次singing
文字。在 中,将抓取所有内容,直到第一次- 一旦看到它,它就完成了:它是懒惰的。它将捕获ng
(.*?)ng
(.*?)
ng
si
在这种情况下。(.*)?ng
将尝试捕获尽可能多的东西 - 这是贪婪的 - 只留下最后的ng
出口。它捕获singi
这里。
除非输入字符串中通配符运行之外的部分有多个实例,否则您不会看到差异。