你如何在正则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;
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!"