我想用另一个字符串替换字符串中模式的所有出现。例如,让我们将所有“$”转换为“!”:
"$$$" -> "!!!"
Plain string.replace仅替换第一个匹配:
"$$$".replace("$", "!"); // gives "$!!"
和正则表达式迫使我逃到特殊的字符
"$$$".replace(/\$/g, "!"); // Pattern is now full of backslashes!
是否可以在不必手动转义特殊字符的情况下进行全局替换?我有一堆模式是我的代码的一部分,我认为如果不得不逃避所有可读性他们手工制作。
我期待一个直接做我想要的技巧,或者至少是一种将字符串转换为new RegExp
可用的excaped形式的方法
答案 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.
例如。
但是,我只是使用马克建议的方式。