为什么正则表达式跳过一些结束括号并在之后匹配它们
考虑这个例子:
他走进咖啡馆陀思妥耶夫斯基,说:“晚上好。”
这里我们有两组引号。让我们假设我们想要匹配两者,以便我们的正则表达式匹配 Dostoevski
和 Good evening.
起初,你可能会想要保持简单:
".*" # matches a quote, then any characters until the next quote
但它不起作用:它匹配 Dostoevski
中的第一个引用,直到 Good evening.
中的结束引用,包括 and said:
部分。 Regex101 演示
为什么会这样?
发生这种情况是因为当遇到 .*
时,正则表达式引擎将所有输入吃掉到最后。然后,它需要匹配最终的 "
。因此,它从匹配结束时退后,放开匹配的文本,直到找到第一个 "
- 当然,这是匹配中的最后一个节目,在节目结束时。
如何防止这种情况并与第一个引号完全匹配?
使用 [^"]*
。它不会吃掉所有的输入 - 只有在第一个 "
之后,就像需要的那样。 Regex101 演示