You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无后行断言替代方案:Safari 15兼容的JS字符串分割正则实现

兼容Safari 15的连字符分割方案(替代后行断言正则)

你原来的正则用了ES2018引入的后行断言((?<!...)),但Safari 15及更早版本不支持这个特性,以下是不依赖后行断言的实现方式,完全满足你的分割规则:

  • 仅分割未被反斜杠\转义的连字符-
  • 连续连字符只分割第一个,后续连字符保留在分割后的子串中

实现代码

function splitByUnescapedHyphen(str) {
  // 用特殊占位符标记可分割的连字符位置
  const markedStr = str.replace(/(^|[^-\\])(?:\\.)*-/g, '$1\u0001');
  // 按占位符分割字符串
  return markedStr.split('\u0001');
}

代码说明

  1. 标记可分割连字符:
    正则/(^|[^-\\])(?:\\.)*-/g专门匹配符合条件的分割点:

    • (^|[^-\\]):匹配字符串开头,或者非连字符、非反斜杠的字符(确保当前连字符既不是连续连字符的后续项,也没有被反斜杠转义)
    • (?:\\.)*:匹配任意数量的转义序列(比如\-、\a这类转义内容,不会干扰分割判断)
    • -:匹配要分割的目标连字符
      替换操作把匹配到的内容换成「前置内容 + 特殊占位符」,相当于把可分割的-替换成了分割标记。
  2. 按标记分割:
    用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 21:20:19