【问题标题】:Javascript regex replace affects a single wordJavascript 正则表达式替换影响单个单词
【发布时间】:2016-06-26 19:13:09
【问题描述】:

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

当输入用于例如showers 输出应为 '
当输入为snow moonsnowmoon 时,输出应为;
当输入为 sun 时,预期输出为 I。

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

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

对于每个包含单词 sun 的输入(downpour sunrain sunflurries 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);
}  

谢谢!

【问题讨论】:

  • 你可以用match()代替replace()
  • 在替换之前去掉空格:icon = icon.replace(/\s/g, "");
  • 也许,您需要字边界:/\b(?:showers|snowmoon|downpour|rain|sleet|snow|hail|downpoursun|rainsun|flurries|flurriessun|fog|haze|lightning|cloud|cloudsun|sun)\b/giYes, that is it.
  • @WiktorStribiżew 这将如何匹配 OP 所希望的“雨阳”?
  • @Pointy:用.replace(/\s+/g, '') 删除空格,所以/rainsun/ 匹配rainsunjsfiddle.net/mxycuc0n/1

标签: javascript arrays regex replace


【解决方案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");

【讨论】:

  • 我喜欢你的解决方案。那很快!尊敬的人,会接受你的回答。
【解决方案2】:

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

【讨论】:

  • 嘿。感谢您的评论和解决方案,尽管我已经实施了 Wiktors 之一。
猜你喜欢
  • 1970-01-01
  • 2022-12-10
  • 1970-01-01
  • 1970-01-01
  • 2020-01-06
  • 2015-09-03
  • 2019-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多