你如何在正则expression式中使用variables?

我想在JavaScript中创build一个String.replaceAll()方法,我想使用正则expression式将是最简单的方法来做到这一点。 但是,我不知道如何将一个variables传递给RegEx。 我已经可以做到这一点,它将用“A”代替“B”的所有实例。

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

但是我想要做这样的事情:

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

但显然这只会取代文本“replaceThis”…所以如何将这个variables传递给我的RegExstring?

而不是使用/regex/g语法,您可以构build一个新的RegExp对象:

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

你可以这样dynamic地创build正则expression式对象。 那么你会做:

 "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"replace期间,但它会变成…

 regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex 

这是因为,虽然"." 是一个string,在RegExp构造函数中它仍然被解释为一个正则expression式,意思是任何非换行字符,即string中的每个字符。 为此,以下function可能会有用:

  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,“A”);

一如既往:除非必须,否则不要使用正则expression式。 对于一个简单的stringreplace,成语是:

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

那么你不必担心Gracenotes的答案中提到的引用问题。

对于任何想用匹配方法使用variables的人来说,这都适合我

 var alpha = 'fig'; 'food fight'.match(alpha + 'ht')[0]; // fight 

这个:

 var txt=new RegExp(pattern,attributes); 

相当于这个:

 var txt=/pattern/attributes; 

http://www.w3schools.com/jsref/jsref_obj_regexp.asp

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

testing这个工具

你想要dynamic地构build正则expression式,为此正确的解决scheme是使用new RegExp(string)构造函数。 为了使构造函数字面上的特殊字符,你必须逃避它们。 在jQuery UI自动完成小部件中有一个内置函数$.ui.autocomplete.escapeRegex

您可以使用内置的$.ui.autocomplete.escapeRegex函数。 它将采用单个string参数并转义所有正则expression式字符,使结果安全地传递给new RegExp()

如果您使用的是jQuery UI,您可以使用该function,或从源代码复制其定义:

 function escapeRegex(value) { return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" ); } 

像这样使用它:

 "[za][za][za]".replace(new RegExp(escapeRegex("[za]"), "g"), "[az]"); // escapeRegex("[za]") -> "\[z\-a\]" // new RegExp(escapeRegex("[za]"), "g") -> /\[z\-a\]/g // end result -> "[az][az][az]" 

虽然你可以创builddynamic创build的RegExp(按照这个问题的其他答案),但我会回应我的评论,从类似的post : String.replace()的functionforms是非常有用的,在许多情况下,减less需要dynamic创build的RegExp对象。 (这是一种痛苦,因为你必须以一个string表示input到RegExp构造函数,而不是使用斜杠/ [AZ] + / regexp文字格式)

这是另一个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; }; 

为了满足我需要在正则expression式中插入一个variables/别名/函数,这就是我想到的:

 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”是我想要插入variables的原始正则expression式,“xx”是该variables/别名/函数的占位符,“yy”是实际的variables名称,别名或函数。

 String.prototype.replaceAll = function(a, b) { return this.replace(new RegExp(a.replace(/([.?*+^$[\]\\(){}|-])/ig, "\\$1"), 'ig'), b) } 

testing它像:

 var whatever = 'Some [b]random[/b] text in a [b]sentence.[/b]' console.log(whatever.replaceAll("[", "<").replaceAll("]", ">")) 

你可以使用这个,如果$ 1不适合你

 var pattern = new RegExp("amman","i"); "abc Amman efg".replace(pattern,"<b>"+"abc Amman efg".match(pattern)[0]+"</b>"); 

你总是可以重复使用indexOf

 String.prototype.replaceAll = function(substring, replacement) { var result = ''; var lastIndex = 0; while(true) { var index = this.indexOf(substring, lastIndex); if(index === -1) break; result += this.substring(lastIndex, index) + replacement; lastIndex = index + substring.length; } return result + this.substring(lastIndex); }; 

当replace包含匹配时,这不会进入无限循环。

你所有的解决scheme在这里,

将variables传递给正则expression式。

我已经实现的是从一个文本字段,这是你想要replace和另一个是“replace”文本字段的值,

从一个variables的文本字段中获取值,并将该variables设置为RegExp函数以进一步replace。在我的情况下,我正在使用Jquery,您也只能通过javaScript来完成。

JavaScript代码:

  var replace =document.getElementById("replace}"); // getting a value from a text field with I want to replace var replace_with = document.getElementById("with"); //Getting the value from another text fiels with which I want to replace anather string. var sRegExInput = new RegExp(replace, "g"); $("body").children().each(function() { $(this).html($(this).html().replace(sRegExInput,replace_with)); }); 

这个代码是Onclick事件的一个button,你可以把它放在一个函数中调用。

所以现在你可以通过replace函数中的variables。

和咖啡的脚本版本的史蒂文·彭尼的答案,因为这是#2的谷歌结果….即使咖啡只是与很多字符删除的JavaScript …;)

 baz = "foo" filter = new RegExp(baz + "d") "food fight".match(filter)[0] // food 

并在我的具体情况

 robot.name=hubot filter = new RegExp(robot.name) if msg.match.input.match(filter) console.log "True!"