javascript中正则表达式的非贪婪重复的问题?

发布于 2022-09-02 15:03:33 字数 569 浏览 11 评论 0

在《javascript权威指南》第六版 第十章 10.1.3节中
书中在介绍非贪婪的重复时举了一个例子,用正则表达式 /a+?/ 来匹配字符串 aaa ,
原话这样说的:

但是/a+?/也可以匹配一个或多个连续的字母a,但是它是尽可能少地匹配,我们将 aaa 作为匹配字符串,但只能匹配第一个a。

但是后来书中又举了一个例子,用正则表达式 /a+?b/ 来匹配字符串 aaab ,而匹配的是整个字符串。书中这样解释:

这是因为正则表达式的模式匹配总是会寻找字符串中第一个可能匹配的位置。由于该匹配是从字符的第一个字符开始的,因此在这里不考虑它的子串中更短的匹配。

两段话不矛盾么?为什么/a+?b/会匹配aaab而不是 匹配一个a和最后一个b?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

旧街凉风 2022-09-09 15:03:33
  1. 总是寻找字符串中第一个可能匹配的位置。所以 aaab 中第一个 a 直接满足 /a+?b/ 时直接就匹配了。

  2. 非贪婪时尽可能少的匹配。所以 aaa 中第一个 a 直接满足 /a+?/ 时直接就匹配了。

为什么 /a+?b/ 会匹配 aaab 而不是匹配第三个 a 和最后一个 b ?

因为『寻找字符串中第一个可能匹配的位置』的优先级比『非贪婪』更高。

梦幻的心爱 2022-09-09 15:03:33

可以看一下《高性能JavaScript》第五章理解回溯原理:
先跳过表达式a+?,匹配表达式b,第一个字符'a'匹配失败,回溯,表达式a+?匹配第一个字符'a',重复之前的过程,表达式a+?一直匹配到第三个字符'a'。此时再次匹配表达式b,和最后一个字符'b'匹配成功,则正则匹配结束,匹配项为 aaab

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文