我想在JavaScript中创建String.replaceAll()方法,我认为使用正则表达式是最简洁的方法。然而,我无法确定如何将变量传递给正则表达式。我已经可以这样做了,这将用“A”替换“B”的所有实例。
"ABABAB".replace(/B/g, "A");
但我想这样做:
String.prototype.replaceAll = function(replaceThis, withThis) {
this.replace(/replaceThis/g, withThis);
};
但显然,这只会替换文本“replaceThis”。。。那么如何将此变量传递到正则表达式字符串中?
正如埃里克·温德林提到的,你可以这样做:
str1 = "pattern"
var re = new RegExp(str1, "g");
"pattern matching .".replace(re, "regex");
这会产生“正则表达式匹配”。然而,如果str1为“.”,则会失败。您可能希望结果是“模式匹配正则表达式”,将句点替换为“正则表达式”。但结果是。。。
regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex
这是因为,尽管“.”是一个字符串,但在RegExp构造函数中,它仍然被解释为正则表达式,表示任何非换行字符,表示字符串中的每个字符。为此,以下功能可能有用:
RegExp.quote = function(str) {
return str.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
};
然后您可以执行以下操作:
str1 = "."
var re = new RegExp(RegExp.quote(str1), "g");
"pattern matching .".replace(re, "regex");
产生“模式匹配正则表达式”。
String.prototype.replaceAll = function(a, b) {
return this.replace(new RegExp(a.replace(/([.?*+^$[\]\\(){}|-])/ig, "\\$1"), 'ig'), b)
}
测试方式如下:
var whatever = 'Some [b]random[/b] text in a [b]sentence.[/b]'
console.log(whatever.replaceAll("[", "<").replaceAll("]", ">"))
当有一个简单得多的答案仍然可以使用正则表达式完成任务时,所有这些答案看起来都非常复杂。
String.prototype.replaceAll = function(replaceThis, withThis) {
const expr = `${replaceThis}`
this.replace(new RegExp(expr, "g"), withThis);
};
解释
RegExp构造函数接受两个参数:表达式和标志。通过在表达式中使用模板字符串,我们可以将变量传递到类中,它会将其转换为/(replaceThis变量的值)/g。