为何正则表达式在Chrome/Firefox正常运行,Safari却报无效分组名错误?
问题原因
该报错是因为正则中使用了后行否定断言(也就是表达式末尾的(?<!\.)和(?<!\-)语法)。
ES2018标准才正式引入正则后行断言特性,Safari浏览器直到16.4版本(2023年发布)才提供支持,低于该版本的Safari完全无法识别后行断言的语法,就会抛出invalid group specifier name的报错。而Chrome、Firefox对该特性的支持远早于Safari,所以运行正常。
可行解决方案
方案1:改写正则,移除后行断言
先拆解原正则的校验规则:- 开头必须为至少1个英文字母
- 不允许出现连续两个点
..、连续两个横杠-- - 允许的字符范围为英文字母、数字、点、横杠
- 结尾不能为点或者横杠
可以改写为不含后行断言的等价正则,完全覆盖原有校验逻辑,所有主流浏览器都支持:
/^[a-zA-Z](?!.*\.\.)(?!.*--)[a-zA-Z0-9.-]*[a-zA-Z0-9]$/方案2:拆分校验逻辑
不依赖单个复杂正则实现所有校验,拆分为多个简单校验步骤,兼容性最好、可读性更高:function validateString(str) { // 校验开头为英文字母 if (!/^[a-zA-Z]/.test(str)) return false // 校验无连续点、连续横杠 if (/\.\./.test(str) || /--/.test(str)) return false // 校验字符范围合法 if (!/^[a-zA-Z0-9.-]+$/.test(str)) return false // 校验结尾不为点/横杠 if (/[.-]$/.test(str)) return false return true }方案3:添加语法转译兼容
如果项目中大量使用了后行断言等新正则特性,可以引入Babel正则转译插件或者regexpu-core工具,在编译阶段把高版本正则语法转译为低版本浏览器兼容的代码。
内容的提问来源于stack exchange,提问作者p zankat
相关产品推荐
相关产品推荐

