javascript - JavaScript 怎么将变量传递给一个正规表达式?

  显示原文与译文双语对照的内容

我想用JavaScript创建一个 String.replaceAll() 方法,我认为使用 正规表达式 是最简单的方法。 但是,我想不出如何将变量传递给 正规表达式 。 我已经可以这样做了,它将把"b"的所有实例替换为"一个"。


"ABABAB".replace(/B/g,"A");

但是我想做这样的事情:


String.prototype.replaceAll = function(replaceThis, withThis) {
 this.replace(/replaceThis/g, withThis);
};

但显然这将只替换文本"replaceThis"。。所以如何将该变量传递到 正规表达式 字符串?

时间:

不使用 /regex/g 语法,你可以构造一个新的RegExp 对象:


var re = new RegExp("regex","g");

你可以这种方式动态创建 正规表达式 对象。 然后你将:


"mystring".replace(re,"newstring");

就像 Eric Wendelin提到的,你可以执行如下操作:


str1 ="pattern"
var re = new RegExp(str1,"g");
"pattern matching.".replace(re,"regex");

这将产生 "regex matching." 。然而,如果str1是 ".",它将失败。 你会预计结果为 "pattern matching regex",取代有 "regex" 以来的,但它最终都是- -


regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex

这是因为,尽管 "." 是一个字符串,要说的是构造函数中它仍然是解释为一个正则表达式字符串里面的每个字符,这意味着任何non-line-break字母,意义。 为此,以下函数可能有用:


 RegExp.quote = function(str) {
 return str.replace(/([.?*+^$[](){}|-])/g,"$1");
 };

然后你可以:


str1 ="."
var re = new RegExp(RegExp.quote(str1),"g");
"pattern matching.".replace(re,"regex");

生成 "pattern matching regex"

"ABABAB".replace(/B/g,"一个") ;

总是:不要使用 正规表达式,除非必须。 对于简单字符串替换,该习惯用法是:


'ABABAB'.split('B').join('A')

那么你就不必担心gracenotes回答的引用问题。


String.prototype.replaceAll = function (replaceThis, withThis) {
 var re = new RegExp(replaceThis,"g"); 
 return this.replace(re, withThis);
};
var aa ="abab54..aba".replaceAll(".","v");

使用这里工具 。Test进行测试

这是:


var txt=new RegExp(pattern,attributes);

等同于:


var txt=/pattern/attributes;

参见 http://www.w3schools.com/jsref/jsref_obj_regexp.asp web 。

下面是另一个replaceAll实现:


 String.prototype.replaceAll = function (stringToFind, stringToReplace) {
 if ( stringToFind == stringToReplace) return this;
 var temp = this;
 var index = temp.indexOf(stringToFind);
 while (index!= -1) {
 temp = temp.replace(stringToFind, stringToReplace);
 index = temp.indexOf(stringToFind);
 }
 return temp;
 };

为了满足我在正则表达式中插入 variable/alias/function的需要,这就是我所提出的:


oldre =/xx("")/;
function newre(e){
 return RegExp(e.toString().replace(///g,"").replace(/xx/g, yy),"g")
};

String.prototype.replaceAll = this.replace(newre(oldre),"withThis");

其中'oldre'是我想插入变量的原始正则表达式,'xx'是 variable/alias/function,的占位符,'yy'是实际变量名,别名或者函数。


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("]",">"))

...