Javascript 如何在无需转义所有内容的情况下进行全局字符串替换?

Javascript 如何在无需转义所有内容的情况下进行全局字符串替换?,javascript,regex,Javascript,Regex,我想用另一个字符串替换字符串中所有出现的模式。例如,让我们将所有“$”转换为“!”: 纯字符串.replace仅替换第一个匹配项: "$$$".replace("$", "!"); // gives "$!!" 正则表达式迫使我逃到特殊的字符 "$$$".replace(/\$/g, "!"); // Pattern is now full of backslashes! 是否可以在不必手动转义特殊字符的情况下进行全局替换?我有一堆模式是我代码的一部分,如果必须手动转义所有模式,我认为可读性

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


纯字符串.replace仅替换第一个匹配项:

"$$$".replace("$", "!"); // gives "$!!"
正则表达式迫使我逃到特殊的字符

"$$$".replace(/\$/g, "!"); // Pattern is now full of backslashes!
是否可以在不必手动转义特殊字符的情况下进行全局替换?我有一堆模式是我代码的一部分,如果必须手动转义所有模式,我认为可读性会受到影响

我希望有一个技巧可以直接实现我想要的功能,或者至少有一种方法可以将字符串转换为可由
新RegExp
使用的可转换形式。请尝试以下方法:

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

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

您可以将regest作为字符串提供,并为所需的标志提供第三个参数


您可以将regest作为字符串提供,并为所需的标志提供第三个参数


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

您可以编写自己的()或从库()获取它


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

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

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

您可以编写自己的()或从库()获取它


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

function replace_all(string, pattern, replacement){
    return string.replace( new RegExp(escape(pattern), "g"), replacement);
}
“纯字符串。替换仅替换第一个匹配项”

在这种情况下,根据替换操作的效率,可以执行以下操作:

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_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;
};
比如说


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

遗憾的是,这只适用于Firefox(我应该在问题上提到这一点)遗憾的是,这只适用于Firefox(我应该在问题上提到这一点),这仍然迫使我使用
“\\\$”
进行替换。甚至更多的反斜杠!这仍然迫使我使用
“\\$”
进行替换。甚至更多的反斜杠!当我有一个正则表达式引擎时,我不想重新实现简单的字符串匹配算法…:)当我有一个正则表达式引擎时,我不想重新实现简单的字符串匹配算法…:)
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.