假设我有一个函数icon_trans(icon)
用char替换预期的输入作为输出。该功能正常工作,但有一个问题。
当输入是例如showers
预计输出'
当输入为snow moon
或snowmoon
时,预期输出为;
当输入是太阳时,输出是预期的I.
但是,当输入为rain sun
或rainsun
时,输出为I
,而不是预期的%
。
这样做的原因是合乎逻辑的,因为正则表达式正在修补rain
然后sun
并返回sun I
,而不是rainsun
一个%
1}}。
对于其中包含sun
字downpour sun
,rain sun
,flurries 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 :(得分: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");
&#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]];