How do you use a variable in a regular expression?
我想用javascript创建一个
1 | "ABABAB".replace(/B/g,"A"); |
但我想这样做:
1 2 3 | String.prototype.replaceAll = function(replaceThis, withThis) { this.replace(/replaceThis/g, withThis); }; |
但是很明显,这只会替换文本
您可以构造一个新的regexp对象,而不是使用
1 2 | var replace ="regex"; var re = new RegExp(replace,"g"); |
您可以这样动态地创建regex对象。然后你会做:
1 | "mystring".replace(re,"newstring"); |
正如埃里克·温德林所说,你可以这样做:
1 2 3 | str1 ="pattern" var re = new RegExp(str1,"g"); "pattern matching .".replace(re,"regex"); |
这就产生了
1 | regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex |
这是因为,虽然
1 2 3 | RegExp.quote = function(str) { return str.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1"); }; |
然后你可以做:
1 2 3 | str1 ="." var re = new RegExp(RegExp.quote(str1),"g"); "pattern matching .".replace(re,"regex"); |
产生
"ABABAB".replace(/B/g,"A");
一如既往:不要使用regex,除非你必须这样做。对于简单的字符串替换,习惯用法是:
1 | 'ABABAB'.split('B').join('A') |
那么你不必担心Gracenotes答案中提到的引用问题。
对于任何想在match方法中使用变量的人来说,这对我很有用
1 2 | var alpha = 'fig'; 'food fight'.match(alpha + 'ht')[0]; // fight |
这是:
1 | var txt=new RegExp(pattern,attributes); |
相当于:
1 | var txt=/pattern/attributes; |
请参阅http://www.w3schools.com/jsref/jsref_obj_regexp.asp。
1 | this.replace( new RegExp( replaceThis, 'g' ), withThis ); |
如果你想得到所有的词条(
1 | re = new RegExp(`\\b${replaceThis}\\b`, 'gi'); |
例子:
1 2 3 4 | let inputString ="I'm John, or johnny, but I prefer john."; let replaceThis ="John"; let re = new RegExp(`\\b${replaceThis}\\b`, 'gi'); console.log(inputString.replace(re,"Jack")); // I'm Jack, or johnny, but I prefer Jack. |
您需要动态地构建正则表达式,为此,正确的解决方案是使用
[...] you can make use of the built-in
$.ui.autocomplete.escapeRegex function. It'll take a single string
argument and escape all regex characters, making the result safe to
pass tonew RegExp() .
如果您使用的是jquery用户界面,那么您可以使用该函数,或者从源代码复制其定义:
1 2 3 | function escapeRegex(value) { return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&" ); } |
像这样使用:
1 2 3 4 | "[z-a][z-a][z-a]".replace(new RegExp(escapeRegex("[z-a]"),"g"),"[a-z]"); // escapeRegex("[z-a]") ->"\[z\-a\]" // new RegExp(escapeRegex("[z-a]"),"g") -> /\[z\-a\]/g // end result ->"[a-z][a-z][a-z]" |
1 2 3 4 5 | String.prototype.replaceAll = function (replaceThis, withThis) { var re = new RegExp(replaceThis,"g"); return this.replace(re, withThis); }; var aa ="abab54..aba".replaceAll("\\.","v"); |
使用此工具进行测试
1 2 3 | String.prototype.replaceAll = function(a, b) { return this.replace(new RegExp(a.replace(/([.?*+^$[\]\\(){}|-])/ig,"\\$1"), 'ig'), b) } |
测试如下:
1 2 3 | var whatever = 'Some [b]random[/b] text in a [b]sentence.[/b]' console.log(whatever.replaceAll("[","<").replaceAll("]",">")) |
下面是另一个replaceall实现:
1 2 3 4 5 6 7 8 9 10 | 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; }; |
虽然您可以动态地创建regexp(根据对这个问题的其他响应),但我将从类似的文章中回显我的注释:string.replace()的函数形式非常有用,并且在许多情况下减少了对动态创建的regexp对象的需要。(这有点痛苦,因为您必须将regexp构造函数的输入表示为字符串,而不是使用斜杠/[a-z]+/regexp文本格式)
以及StevenPenny答案的CoffeeScript版本,因为这是2 Google的结果……即使咖啡只是一个去掉了很多字符的javascript……)
1 2 3 | baz ="foo" filter = new RegExp(baz +"d") "food fight".match(filter)[0] // food |
在我的特殊情况下
1 2 3 4 | robot.name=hubot filter = new RegExp(robot.name) if msg.match.input.match(filter) console.log"True!" |
为了满足我在正则表达式中插入变量/别名/函数的需要,我想到了以下方法:
1 2 3 4 5 6 | 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"是要插入变量的原始regexp,"xx"是该变量/别名/函数的占位符,"yy"是实际的变量名、别名或函数。
如果1美元不适合你,你可以用这个
1 2 | var pattern = new RegExp("amman","i"); "abc Amman efg".replace(pattern,""+"abc Amman efg".match(pattern)[0]+""); |
您可以反复使用
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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); }; |
当替换包含匹配项时,这不会进入无限循环。
您的解决方案如下:
将变量传递给正则表达式。
我实现的方法是从一个文本字段中获取值,这个文本字段是您要替换的字段,另一个是"替换为"文本字段,从变量中的文本字段获取值,并将变量设置为regexp函数以进一步替换。在我的例子中,我使用的是jquery,您也只能通过JavaScript来实现。
javascript代码:
1 2 3 4 5 6 7 | 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 fields with which I want to replace another string. var sRegExInput = new RegExp(replace,"g"); $("body").children().each(function() { $(this).html($(this).html().replace(sRegExInput,replace_with)); }); |
此代码位于按钮的onclick事件上,您可以将其放入要调用的函数中。
所以现在可以在replace函数中传递变量。
这些答案我都不清楚。我最终在http://burnignomation.com/php-programming-tips/how-to-use-a-variable-in-replace-function-of-javascript找到了一个很好的解释。/
简单的答案是:
1 2 | var search_term = new RegExp(search_term,"g"); text = text.replace(search_term, replace_term); |
例如:
1 2 3 4 5 6 7 8 9 10 11 | $("button").click(function() { Find_and_replace("Lorem","Chocolate"); Find_and_replace("ipsum","ice-cream"); }); function Find_and_replace(search_term, replace_term) { text = $("textbox").html(); var search_term = new RegExp(search_term,"g"); text = text.replace(search_term, replace_term); $("textbox").html(text); } |
1 2 3 4 5 | <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"> <textbox> Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum </textbox> <button>Click me</button> |