js正则match方法匹配顺序疑惑?

发布于 2022-09-13 00:12:24 字数 316 浏览 27 评论 0

有两行正则代码
'\clip'.match(/clip|\clip/g)
'\clip'.match(/clip/g)
执行结果如下
image.png
主要疑问是,正则匹配是从左至右的吧,但是第一行执行结果匹配的是|分支后的情况,为什么不是先得出第二行这种执行结果呢?

申明:
题目给的代码显示有误,没认真检查不好意思,才发现是思否的编辑器转义了
image.png

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

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

发布评论

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

评论(2

强辩 2022-09-20 00:12:24

可以思考一下正则引擎如何将表达式 /clip|\\clip/g 应用于字符串 \\clip
首先正则分支前面 clip| 中的 c 去匹配字符串\\clip中的 \, 发现不匹配;
然后正则分支后面的|\\clip中的 \ 去匹配字符串 \\clip 中的 \, ok,现在匹配了 ,
继续处理正则分支后面 |\\clip 的部分, 现在是字符 c(老版本的Chrome好像把第一个解释为转义符,导致正则表达式中\\是匹配 \ ,所以是字符 c,新的好像修复了这个问题 ),字符串 \\clip 的第二位是 \ , 不匹配;
正则引擎得到字符串第一位没法满足正则的两个分支,然后从字符串第二位开始匹配, 也就是字符串 \clip, 第一位的 \ 跳过,
后续的过程同前面的过程是一样的,分支前面的 clip| 没法匹配字符串 \clip 中的 \,
然后走正则分支后面的|\\clip部分,正则 \\ 可以匹配字符串 \clip 中的 \ , 继续正则 |\\clip 后续部分, 此时正则的 c 可以匹配字符串的 c ,就这样一直处理完成,发现最后都能匹配,之后引擎就返回结果;当然如果不匹配的话,那么就需要从字符串第三位开始处理,过程基本同上

补充回答:
后续看了一下,这个应该是和正则引擎实现有关,可查看 百度百科,里面有将两个引擎NFA和DFA, 浏览器出于速度的考虑采用的应该是DFA

断肠人 2022-09-20 00:12:24

Chrome 91.0.4472.77 版本

image.png

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