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

Javascript正则表达式替换影响单个单词,javascript,arrays,regex,replace,Javascript,Arrays,Regex,Replace,假设我有一个函数icon\u trans(icon),它将预期的输入替换为字符作为输出。该函数工作正常,但存在一个问题 当输入用于例如淋浴时,输出应为,,, 当输入为snowmoon或snowmoon时,预期输出为 当输入为sun时,输出为I 但是,当输入为rain sun或rainsun时,输出为I,而不是预期的% 这样做的原因是合乎逻辑的,因为正则表达式正在修补rain,然后修补sun,并返回sun char,它是I,而不是rainsun一个% 同样的情况也发生在每个输入中包含单词sun(倾

假设我有一个函数
icon\u trans(icon)
,它将预期的输入替换为字符作为输出。该函数工作正常,但存在一个问题

当输入用于例如淋浴时,输出应为
,,
当输入为
snowmoon
snowmoon
时,预期输出为

当输入为sun时,输出为I

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

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

同样的情况也发生在每个输入中包含单词
sun
倾盆大雨的太阳
雨日
雨日
等)

JS fiddle将在问题的末尾

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);
}  
功能图标\u trans(图标){
icon=icon.replace(//\s+/g',);//删除空白
var mapObj={
淋浴:“'”,
雪月:“;”,
倾盆大雨:“*”,
雨:“$”,
冰雹:“0”,
雪:“9”,
欢呼:“5”,
暴雨孙:“+”,
雨日:“%”,
慌乱:“6”,
小雨:“7”,

fog:“您需要将备选方案放入一个分组结构中(我建议使用非捕获组
(?:)
),并在两端设置单词边界
\b

/\b(?:showers|snowmoon|downpour|rain|sleet|snow|hail|downpoursun|rainsun|flurries|flurriessun|fog|haze|lightning|cloud|cloudsun|sun)\b/gi
 ^^^^^                                                                                                                             ^^^
请参见演示如何将
rain sun
替换为
%
(如预期的那样):

功能图标\u trans(图标){
icon=icon.replace(//\s+/g',);//删除空白
var mapObj={
淋浴:“'”,
雪月:“;”,
倾盆大雨:“*”,
雨:“$”,
冰雹:“0”,
雪:“9”,
欢呼:“5”,
暴雨孙:“+”,
雨日:“%”,
慌乱:“6”,
小雨:“7”,

fog:您的正则表达式基本上以非常复杂的方式执行
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]];

你可以使用
match()
而不是
replace()
在进行替换之前去掉空格:
icon=icon.replace(/\s/g,”)
也许,你需要单词边界:
/\b(?:阵雨|雪月|倾盆大雨|雨|雪|冰雹|倾盆大雨|雨日|雨|雾|雾|闪电|太阳|)\b/gi
。@WiktorStribiżew这将如何与OP所需的“rain sun”匹配?@Pointy:空格将用
删除。替换(/\s+/g.))
,所以
/rainsun/
匹配
rainsun
。我喜欢你的解决方案。而且速度很快!感谢你,我会接受你的回答。嘿。我感谢你的评论和解决方案,尽管我已经实现了Wiktors一个。