多个正则表达式替换

时间:2010-11-26 13:01:21

标签: javascript regex

我对正则表达式感到困惑我认为当涉及到这些可怕的代码时,我会有阅读困难..无论如何,必须有一种更简单的方法来做到这一点 - (即在一行中列出一组替换实例) , 任何人?提前谢谢。

function clean(string) {
    string = string.replace(/\@~rb~@/g, '').replace(/}/g, '@~rb~@');
    string = string.replace(/\@~lb~@/g, '').replace(/{/g, '@~lb~@');
    string = string.replace(/\@~qu~@/g, '').replace(/\"/g, '@~qu~@');
    string = string.replace(/\@~cn~@/g, '').replace(/\:/g, '@~cn~@');
    string = string.replace(/\@-cm-@/g, '').replace(/\,/g, '@-cm-@');
    return string;
}

5 个答案:

答案 0 :(得分:32)

您可以使用功能替换。对于每个匹配,函数决定应该替换它。

function clean(string) {
    // All your regexps combined into one:
    var re = /@(~lb~|~rb~|~qu~|~cn~|-cm-)@|([{}":,])/g;

    return string.replace(re, function(match,tag,char) {
        // The arguments are:
        // 1: The whole match (string)
        // 2..n+1: The captures (string or undefined)
        // n+2: Starting position of match (0 = start)
        // n+3: The subject string.
        // (n = number of capture groups)

        if (tag !== undefined) {
            // We matched a tag. Replace with an empty string
            return "";
        }

        // Otherwise we matched a char. Replace with corresponding tag.
        switch (char) {
            case '{': return "@~lb~@";
            case '}': return "@~rb~@";
            case '"': return "@~qu~@";
            case ':': return "@~cn~@";
            case ',': return "@-cm-@";
        }
    });
}

答案 1 :(得分:13)

您可以定义一个通用函数,如果您可以在代码的更多部分中重用它,那将是有意义的,从而使其成为DRY。如果你没有理由定义一个通用的,我只会压缩​​清除序列的部分,并保留其他部分替换它们。

function clean(string) {
    string = string.replace(/\@~rb~@|\@~lb~@|\@~qu~@|\@~cn~@|\@-cm-@/g, '')
      .replace(/}/g, '@~rb~@').replace(/{/g, '@~lb~@')
      .replace(/\"/g, '@~qu~@').replace(/\:/g, '@~cn~@')
      .replace(/\,/g, '@-cm-@');
    return string;
}

但请注意,替换的顺序在此代码中已更改..虽然似乎但它们可能不会影响结果。

答案 2 :(得分:0)

你可以这样做:

function clean(str) {
    var expressions = {
        '@~rb~@': '',
        '}':      '@~rb~@',
        // ...
    };

    for (var key in expressions) {
        if (expressions.hasOwnProperty(key)) {
            str = str.replace(new RegExp(key, 'g'), expressions[key]);
        }
    }

    return str;
}

请记住,对象属性的顺序无法可靠地确定(但大多数实现将按定义的顺序返回它们)。如果您需要确保特定的订单,您可能需要这样的多个结构。

答案 3 :(得分:0)

你可以按顺序将它们全部链接起来。

function clean(string) {
    return string.replace(/\@~rb~@/g, '').replace(/}/g, '@~rb~@')
                 .replace(/\@~lb~@/g, '').replace(/{/g, '@~lb~@')
                 .replace(/\@~qu~@/g, '').replace(/\"/g, '@~qu~@')
                 .replace(/\@~cn~@/g, '').replace(/\:/g, '@~cn~@')
                 .replace(/\@-cm-@/g, '').replace(/\,/g, '@-cm-@');
}

答案 4 :(得分:0)

  

......必须有一种更简单的方法   this-(即列出一组替换   一行中的实例)......

百胜,API首先思考。怎么样......?

var clean = multiReplacer({
    "@~rb~@": "",
    "@~lb~@": "",
    "@~qu~@": "",
    "@~cn~@": "",
    "@-cm-@": "",
    "}": "@~rb~@",
    "{": "@~lb~@",
    "\\": "@~qu~@",
    ":": "@~cn~@",
    ",": "@-cm-@"
});

水暖:

// From http://simonwillison.net/2006/Jan/20/escape/
RegExp.escape = function(text)
{
    return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
};

function multiReplacer(replacements)
{
    var regExpParts = [];
    for (prop in replacements)
    {
        if (replacements.hasOwnProperty(prop))
        {
            regExpParts.push(RegExp.escape(prop));
        }
    }

    var regExp = new RegExp(regExpParts.join("|"), 'g');
    var replacer = function(match)
    {
        return replacements[match];
    };

    return function(text)
    {
        return text.replace(regExp, replacer);
    };
}