String.prototype.replaceAll = function(str1, str2, ignore) {
return this.replace(
new RegExp(
str1.replace(/([\/\,\!\\\^\$\{\}\[\]\(\)\.\*\+\?\|\<\>\-\&])/g,"\\$&"),(ignore?"gi":"g")),(typeof(str2)=="string")?str2.replace(/\$/g,"$$$$"
):str2
)};
用法:
var a = "I am Javascript"; console.log( a.replaceAll("am", "love") ); // => I love Javascript
但是,关于字符或单词的多次交换,我必须多次运行原型才能实现。但我想到过这样的事情:
var a = "I am Java"; console.log( a.replaceAll(["am" , "Java"], ["love", "Javascript"]) ); // => I love Javascript
所以您能帮我实现它吗?还是有其他选择?
|
替代连接要替换的值来动态创建正则表达式。然后为replace
提供一个回调函数,并使用其match参数作为键在swaps
对象中查找其对应对。 const s = "I am Java";
const swaps = {am: "love", Java: "JS"};
const pattern = new RegExp(Object.keys(swaps).join("|"), "g");
console.log(s.replace(pattern, m => swaps[m]));
要处理不区分大小写的替换,请确保swaps
中的所有键都是小写字母(通过编程或手动,具体取决于用法),并在输入之前将匹配的字母小写:const s = "I am Java"; const swaps = {am: "love", java: "JS"}; const pattern = new RegExp(Object.keys(swaps).join("|"), "gi"); console.log(s.replace(pattern, m => swaps[m.toLowerCase()]));
String.prototype.replaceAll = function(str1, str2, ignore) {
let flags = 'g';
if (ignore) {
flags += 'i';
}
if (Array.isArray(str1) && Array.isArray(str2)) {
let newStr = this;
str1.map((element, index) => {
if (str2[index]) {
newStr = newStr.replace(new RegExp(element, flags), str2[index]);
}
return newStr;
});
return newStr;
}
else {
return this.replace(new RegExp(str1, flags), str2);
}
}