我有一个字符串原型,其代码如下:
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);
}
}