关于javascript:如何在正则表达式中使用变量?

How do you use a variable in a regular expression?

我想用javascript创建一个String.replaceAll()方法,我认为使用regex是最简单的方法。但是,我不知道如何将变量传入regex。我已经可以这样做了,用"A"替换"B"的所有实例。

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

但我想这样做:

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

但是很明显,这只会替换文本"replaceThis"…,那么如何将这个变量传递给我的regex字符串呢?


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

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");

这就产生了"regex matching ."。然而,如果str1是".",它将失败。你会期望结果是"pattern matching regex",用"regex"替换周期,但结果是…

1
regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex

这是因为,虽然"."是字符串,但在regexp构造函数中,它仍然被解释为正则表达式,表示任何非换行符,表示字符串中的每个字符。为此,以下功能可能有用:

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");

产生"pattern matching 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 );


如果你想得到所有的词条(g,就不区分大小写(i),并且使用边界,这样它就不是另一个词中的一个词(\\b):

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.

您需要动态地构建正则表达式,为此,正确的解决方案是使用new RegExp(string)构造函数。为了让构造函数从字面上处理特殊字符,必须对它们进行转义。jquery ui autocomplete小部件中有一个内置函数,名为$.ui.autocomplete.escapeRegex

[...] 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 to new 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]+"");

您可以反复使用indexOf

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>