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

如何修复不兼容Firefox的地址正则表达式?

解决Firefox不支持后置断言的地址转换正则问题

你的问题根源在于原正则使用了ES2018引入的后置断言(lookbehind)语法,虽然新版本Firefox已经支持,但如果你的目标环境包含旧版本Firefox,就会出现兼容性问题。我们可以通过将后置断言的逻辑转换为捕获组+替换函数的方式,完全避开后置断言,同时实现相同的地址转换效果。

修改后的完整代码

function transform(addr) {
  // 替换原后置断言为可选捕获组,捕获需要排除的前缀
  const regEx = /((д(ом)?|стр(оение)?\/|-)\.?\s*\d*)?(\d+((,?\s*(к(ор(п(ус)?)?)?\.?\s*\d+)|(\s*[а-я])|(\s*\/\s*\d+))?\s*$)/;
  
  return addr.replace(regEx, (match, excludePrefix, _, __, targetPart) => {
    // 若捕获到了不需要处理的前缀,直接返回原匹配;否则给目标数字部分添加"д. "
    return excludePrefix ? match : `д. ${targetPart}`;
  });
}

// 测试示例
console.log(transform('Татарстан, г. Казань, ул. Баумана, 36')); 
// 输出: Татарстан, г. Казань, ул. Баумана, д. 36

console.log(transform('Татарстан, г. Казань, ул. Баумана, д. 36')); 
// 输出不变:Татарстан, г. Казань, ул. Баумана, д. 36

console.log(transform('Татарстан, г. Казань, ул. Баумана, стр. 12/3')); 
// 输出不变:Татарстан, г. Казань, ул. Баумана, стр. 12/3

console.log(transform('Татарстан, г. Казань, ул. Баумана, 36 к. 2')); 
// 输出: Татарстан, г. Казань, ул. Баумана, д. 36 к. 2

关键修改说明

  1. 移除后置断言:把原正则中的(?<!(д(ом)?|стр(оение)?\/|-)\.?\s*\d*)替换为可选捕获组((д(ом)?|стр(оение)?\/|-)\.?\s*\d*)?,这个组会捕获那些我们不需要处理的前缀(比如д. 、стр/、-开头的合法地址前缀)。
  2. 替换逻辑调整:使用replace的函数回调参数,判断是否捕获到了排除前缀:
    • 如果捕获到了(excludePrefix存在),说明当前数字序列已经有合法前缀,直接返回原匹配内容;
    • 如果没有捕获到,说明需要给数字部分添加д. 前缀,返回д. ${targetPart}。

这种写法完全兼容所有支持ES5及以上的浏览器,包括所有版本的现代Firefox,同时完美保留了原正则的地址转换逻辑。

内容的提问来源于stack exchange,提问作者rettoryh13

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:23:22