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一个。