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

夏星夜雨
  • 7

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

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

回复
阅读 387
2 个回答

可以思考一下正则引擎如何将表达式 /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

Chrome 91.0.4472.77 版本

image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏