无后行断言替代方案:Safari 15兼容的JS字符串分割正则实现
兼容Safari 15的连字符分割方案(替代后行断言正则)
你原来的正则用了ES2018引入的后行断言((?<!...)),但Safari 15及更早版本不支持这个特性,以下是不依赖后行断言的实现方式,完全满足你的分割规则:
- 仅分割未被反斜杠
\转义的连字符- - 连续连字符只分割第一个,后续连字符保留在分割后的子串中
实现代码
function splitByUnescapedHyphen(str) { // 用特殊占位符标记可分割的连字符位置 const markedStr = str.replace(/(^|[^-\\])(?:\\.)*-/g, '$1\u0001'); // 按占位符分割字符串 return markedStr.split('\u0001'); }
代码说明
标记可分割连字符:
正则/(^|[^-\\])(?:\\.)*-/g专门匹配符合条件的分割点:(^|[^-\\]):匹配字符串开头,或者非连字符、非反斜杠的字符(确保当前连字符既不是连续连字符的后续项,也没有被反斜杠转义)(?:\\.)*:匹配任意数量的转义序列(比如\-、\a这类转义内容,不会干扰分割判断)-:匹配要分割的目标连字符
替换操作把匹配到的内容换成「前置内容 + 特殊占位符」,相当于把可分割的-替换成了分割标记。
按标记分割:
用split('\u0001')(\u0001是几乎不会出现在普通字符串中的控制字符)分割标记后的字符串,直接得到符合要求的子串数组。
测试验证
console.log(splitByUnescapedHyphen("10-20")); // ['10', '20'] console.log(splitByUnescapedHyphen("10---20")); // ['10', '--20'] console.log(splitByUnescapedHyphen("10---20--30")); // ['10', '--20', '-30'] console.log(splitByUnescapedHyphen("10---20\\--30")); // ['10', '--20\\--30']
内容的提问来源于stack exchange,提问作者ghtx280
相关产品推荐
相关产品推荐

