Javascript 正则表达式替换会影响单个单词

Javascript regex replace affects a single word

本文关键字:单个单 影响 正则表达式 替换 Javascript      更新时间:2023-09-26

假设我有一个函数icon_trans(icon),它用字符作为输出替换预期的输入。该功能按预期工作正常,但存在一个问题。

当输入用于例如 showers输出预计'.
当输入snow moonsnowmoon时,输出预期;
当输入为太阳时,输出预期为 I。

但是,当输入rain sunrainsun时,输出是I,而不是预期的%

这样做的原因是合乎逻辑的,因为正则表达式正在修补rain然后sun并返回I的 sun char,而不是rainsun %的 sun char。

每个包含单词sun的输入(downpour sunrain sunflurries sun等)都会发生同样的情况。

JS小提琴将在问题的末尾。

function icon_trans(icon) {
    icon = icon.replace(/'s+/g, ''); // remove whitespace
    var mapObj = {
        showers:"'",
        snowmoon:";",
        downpour:"*",
        rain:"$",
        sleet:"0",
        snow:"9",
        hail:"5",
        downpoursun:"+",
        rainsun:"%",
        flurries:"6",
        flurriessun:"7",
        fog:"<",
        haze:"?",
        lightning:"F",
        cloud:"!",
        cloudsun:'"',
        sun:"I"
    };
    icon = icon.replace(/showers|snowmoon|downpour|rain|sleet|snow|hail|downpoursun|rainsun|flurries|flurriessun|fog|haze|lightning|cloud|cloudsun|sun/gi, function(matched) {
        icVar = mapObj[matched]
    });
    console.log(icVar);
}  

谢谢!

您需要

将替代方案放入分组结构中(我建议使用非捕获组(?:...)),并在两端设置单词边界'b

/'b(?:showers|snowmoon|downpour|rain|sleet|snow|hail|downpoursun|rainsun|flurries|flurriessun|fog|haze|lightning|cloud|cloudsun|sun)'b/gi
 ^^^^^                                                                                                                             ^^^

查看演示,了解如何将rain sun替换为%(如预期):

function icon_trans(icon) {
    icon = icon.replace(/'s+/g, ''); // remove whitespace
    var mapObj = {
        showers:"'",
        snowmoon:";",
        downpour:"*",
        rain:"$",
        sleet:"0",
        snow:"9",
        hail:"5",
        downpoursun:"+",
        rainsun:"%",
        flurries:"6",
        flurriessun:"7",
        fog:"<",
        haze:"?",
        lightning:"F",
        cloud:"!",
        cloudsun:'"',
        sun:"I"
    };
    icon = icon.replace(/'b(?:showers|snowmoon|downpour|rain|sleet|snow|hail|downpoursun|rainsun|flurries|flurriessun|fog|haze|lightning|cloud|cloudsun|sun)'b/gi, function(matched) {
        icVar = mapObj[matched]
    });
    document.body.innerHTML = icVar;
}  
icon_trans("rain sun");

您的正则表达式基本上以非常复杂的方式mapObj[icon]

function icon_trans(icon) {
    icon = icon.replace(/'s+/g, ''); // remove whitespace
    var mapObj = {...};
    return mapObj[icon];
}

如果您坚持使用正则表达式,这里有一种不那么笨拙的方法:

icon = icon.replace(/'s+/g, '');
var re = new RegExp('''b(' + Object.keys(mapObj).join('|') + ')''b', 'i');
var m = icon.match(re);
return mapObj[m[1]];