2016-03-11 115 views
1

可以說我有一個函數icon_trans(icon),用char作爲輸出替換預期的輸入。該功能可以正常工作,但存在一個問題。Javascript的正則表達式替換影響單個詞

當輸入用於例如預計輸出爲'
當輸入爲snow moonsnowmoon時,預計輸出爲;
當輸入太陽輸出預計I.

BUT,當輸入rain sunrainsun或,輸出爲I,而不是預期%

這樣做的原因是合乎邏輯的,因爲正則表達式是修補rain然後sun和返回太陽焦炭這是I,而不是rainsun一個是%

同樣的情況,對每個具有在它(downpour sunrain sunflurries sun等)字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); 
} 

謝謝!

+0

你可以使用'match()'而不是'replace()' –

+0

在執行替換操作之前刪除空格:'icon = icon.replace(/ \ s/g,「」);' – Pointy

+1

也許,邊界:'/ \ b(?:陣雨|降雪|降雨|降雨|雨雪|冰雹|降雨|降雨| flurries | flurriessun | fog | haze | lightning | cloud | cloudsun | sun)\ b/gi'。 [**是的,就是**](https://jsfiddle.net/mxycuc0n/)。 –

回答

1

您需要將替代成一個分組(我建議非捕獲組(?:...)),並設置字邊界\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");

+0

我愛你的解決方案。而且速度很快!值得讚賞的人,會接受你的答案。 – sensation