為什麼正規表示式跳過一些結束括號並在之後匹配它們

考慮這個例子:

他走進咖啡館陀思妥耶夫斯基,說:“晚上好。”

這裡我們有兩組引號。讓我們假設我們想要匹配兩者,以便我們的正規表示式匹配 Dostoevski Good evening.

起初,你可能會想要保持簡單:

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

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

為什麼會這樣?

發生這種情況是因為當遇到 .*時,正規表示式引擎將所有輸入吃掉到最後。然後,它需要匹配最終的 "。因此,它從匹配結束時退後,放開匹配的文字,直到找到第一個 " - 當然,這是匹配中的最後一個節目,在節目結束時。

如何防止這種情況並與第一個引號完全匹配?

使用 [^"]*。它不會吃掉所有的輸入 - 只有在第一個 " 之後,就像需要的那樣。 Regex101 演示