如何修复不兼容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
关键修改说明
- 移除后置断言:把原正则中的
(?<!(д(ом)?|стр(оение)?\/|-)\.?\s*\d*)替换为可选捕获组((д(ом)?|стр(оение)?\/|-)\.?\s*\d*)?,这个组会捕获那些我们不需要处理的前缀(比如д.、стр/、-开头的合法地址前缀)。 - 替换逻辑调整:使用
replace的函数回调参数,判断是否捕获到了排除前缀:- 如果捕获到了(
excludePrefix存在),说明当前数字序列已经有合法前缀,直接返回原匹配内容; - 如果没有捕获到,说明需要给数字部分添加
д.前缀,返回д. ${targetPart}。
- 如果捕获到了(
这种写法完全兼容所有支持ES5及以上的浏览器,包括所有版本的现代Firefox,同时完美保留了原正则的地址转换逻辑。
内容的提问来源于stack exchange,提问作者rettoryh13
相关产品推荐
相关产品推荐

