为什么正则表达式跳过一些结束括号并在之后匹配它们

考虑这个例子:

他走进咖啡馆陀思妥耶夫斯基,说:“晚上好。”

这里我们有两组引号。让我们假设我们想要匹配两者,以便我们的正则表达式匹配 Dostoevski Good evening.

起初,你可能会想要保持简单:

".*"  # matches a quote, then any characters until the next quote

但它不起作用:它匹配 Dostoevski 中的第一个引用,直到 Good evening. 中的结束引用,包括 and said:部分。 Regex101 演示

为什么会这样?

发生这种情况是因为当遇到 .*时,正则表达式引擎将所有输入吃掉到最后。然后,它需要匹配最终的 "。因此,它从匹配结束时退后,放开匹配的文本,直到找到第一个 " - 当然,这是匹配中的最后一个节目,在节目结束时。

如何防止这种情况并与第一个引号完全匹配?

使用 [^"]*。它不会吃掉所有的输入 - 只有在第一个 " 之后,就像需要的那样。 Regex101 演示