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

时间:2016-03-11 13:49:46

标签: javascript arrays regex replace

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

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

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

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

对于其中包含sundownpour 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);
}  

谢谢!

2 个答案:

答案 0 :(得分:1)

您需要将备选方案放入分组构造中(我建议使用非捕获组(?:...))并在两端设置字边界\b

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

请参阅演示文稿,了解rain sun如何替换为%(正如预期的那样):

&#13;
&#13;
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");
&#13;
&#13;
&#13;

答案 1 :(得分:1)

你的正则表达式基本上以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]];