如何在不需要逃避一切的情况下进行全局字符串替换?

时间:2011-11-09 20:35:36

标签: javascript regex

我想用另一个字符串替换字符串中模式的所有出现。例如,让我们将所有“$”转换为“!”:

"$$$" -> "!!!"

Plain string.replace仅替换第一个匹配:

"$$$".replace("$", "!"); // gives "$!!"

和正则表达式迫使我逃到特殊的字符

"$$$".replace(/\$/g, "!"); // Pattern is now full of backslashes!

是否可以在不必手动转义特殊字符的情况下进行全局替换?我有一堆模式是我的代码的一部分,我认为如果不得不逃避所有可读性他们手工制作。

我期待一个直接做我想要的技巧,或者至少是一种将字符串转换为new RegExp可用的excaped形式的方法

4 个答案:

答案 0 :(得分:4)

Javascript中没有标准的regexp转义函数。

您可以自己编写(source)或从图书馆(dojo example)获取

function escape(s) {
    return s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')
};

这允许我们在运行时创建自定义正则表达式对象

function replace_all(string, pattern, replacement){
    return string.replace( new RegExp(escape(pattern), "g"), replacement);
}

答案 1 :(得分:1)

试试这个:

function replaceAll(txt, replace, with_this) {
  return txt.replace(new RegExp(replace, 'g'),with_this);
}

答案 2 :(得分:0)

您可以将摘要作为字符串提供,并为您想要的标记提供第三个参数

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/replace

"$$$".replace("$", "!", "g");

答案 3 :(得分:0)

“Plain string.replace仅替换第一个匹配”

在这种情况下,根据您需要更换操作的效率,您可以这样做:

String.prototype.my_replace_all_simple = function(f, r) {
    var newstr = "";
    for (var i = 0; i < this.length; ++i) {
        if (this[i] == f) {
            newstr += r;
        } else {
            newstr += this[i];
        }
    }
    return newstr;
};

String.prototype.my_replace_all = function (f, r) {
    if (this.length === 0 || f.length === 0) {
        return this;
    }
    var substart = 0;
    var end = this.length;
    var newstr = "";
    while (true) {
        var subend = this.indexOf(f, substart);
        if (subend === -1) subend = end;
        newstr += this.substring(substart, subend);
        if (subend === end) {
            break;
        }
        newstr += r;
        substart = subend + f.length;
    }
    return newstr;
};
// Adapted from C++ code that uses iterators.
// Might have converted it incorrectly though.

例如。

但是,我只是使用马克建议的方式。