js正则match方法匹配顺序疑惑?
有两行正则代码
'\clip'.match(/clip|\clip/g)
'\clip'.match(/clip/g)
执行结果如下
主要疑问是,正则匹配是从左至右的吧,但是第一行执行结果匹配的是|分支后的情况,为什么不是先得出第二行这种执行结果呢?
申明:
题目给的代码显示有误,没认真检查不好意思,才发现是思否的编辑器转义了
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(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 版本