pikou1995 / pikou1995.github.io

My Github Page
4 stars 1 forks source link

safari 不支持后行断言(lookbehind)正则表达式 #20

Open pikou1995 opened 3 years ago

pikou1995 commented 3 years ago

今天踩了坑,chrome 浏览器是正常的,但是 safari 浏览器中部分页面打不开。因为首页是 ssr 渲染的,所以看起来没问题。而子页面使用组件懒加载,webpack 分的 async chunk 资源下载下来后,safari 浏览器控制台报 chunkLoadError。于是打开 js 文件,只见

invalid regular expression: invalid group specifier name

第一坑

搜索上方关键报错,看到排在搜索引擎 第二位 提供了一个解决方案,把字面量的表达式换成 new RegExp 的方式创建 。配合第一个结果 safari 不支持后行断言(lookbehind),我当时理解成了 先行断言(lookahead)和后行断言(lookbehind) 的正则表达式都可以改成 new RegExp 的方式变为不报错的。后面发现这个文章是错误的。

第二坑

改了之后确实不报错了。我简单测试了其中一个正则表达式,恰好是 先行断言(lookahead) 的正则表达式,本来 safari 就支持,所以我的测试顺利通过了,于是我天真的以为解决了,开始准备把这个坑记录下来。结果写文章的时候,发现根本不是改个写法的事,不支持就是不支持。而为什么不报错,是因为 new RegExp 运行到的时候才会创建对应的正则表达式,如果当时我都测一遍,肯定还是会报错的,测试覆盖不到也是我的问题。

结论

经过 safari 浏览器测试:

// safari 支持
/x(?=y)/ // 先行断言
new RegExp('x(?=y)')
/x(?!y)/ // 正向否定查找
new RegExp('x(?!y)')

// safari 不支持
/(?<=y)x/ // 后行断言
new RegExp('(?<=y)x')
/(?<!y)x/ // 反向否定查找
new RegExp('(?<!y)x')

还总结了一些教训:

  1. 不能迷信网上的结果,靠前的也不一定正确
  2. 要设计一套高效的测试规则
  3. 坚持总结记录,这样才能深入理解问题
luoyeshu0507 commented 3 years ago

LGTM 👍

janeluck commented 3 years ago

yyds

leon776 commented 3 years ago

👍👍