Javascript Regex:如何将变量放入正则表达式中?


206

因此,例如:

function(input){
    var testVar = input;
    string = ...
    string.replace(/ReGeX + testVar + ReGeX/, "replacement")
}

但这当然是行不通的:)有什么办法可以做到这一点?


11
请注意,如果让用户提供此变量,恶意用户很容易通过灾难性的回溯使您的应用程序崩溃。
蒂姆·皮茨克

2
什么是“ ReGeX”?它是变量名吗?它暗示它是RegExp构建的一部分,从而使答案令人困惑(以防读者看不到问题中那些奇怪的字符)。
爱德华(Eduard)

Answers:


272
const regex = new RegExp(`ReGeX${testVar}ReGeX`);
...
string.replace(regex, "replacement");

更新资料

根据一些评论,请务必注意,如果可能存在恶意内容(例如,变量来自用户输入),则可能需要转义变量

ES6更新

在2019年,这通常使用模板字符串编写,并且上面的代码已更新。最初的答案是:

var regex = new RegExp("ReGeX" + testVar + "ReGeX");
...
string.replace(regex, "replacement");

5
确保逃脱您的字符串!参见@zzzzBov答案
jtpereyda

就我而言,这不起作用,请您看看这个jsfiddle,让我知道如果我想将国家代码动态地设置为regex表达式,我该怎么办
Kirankumar Dafda

10
要记住的重要一件事是,在常规字符串中,\字符需要转义,而在正则表达式文字中(通常),/字符需要转义。/\w+\//i变得如此new RegExp("\\w+/", "i")
阿里

3
/ g呢?
钱琛

伙计们,我需要将此正则表达式/[^0-9.-]/g分为两部分:/ [^ 0-9和-] / g怎么做?
最高

79

您可以使用RegExp对象:

var regexstring = "whatever";
var regexp = new RegExp(regexstring, "gi");
var str = "whateverTest";
var str2 = str.replace(regexp, "other");
document.write(str2);

然后,您可以regexstring按照任何想要的方式进行构造。

您可以在此处了解更多信息。


var characterCount = parseInt(attrs.limitCharacterCount); console.log(characterCount); var specialCharactersValidation = new RegExp(“ / ^ [a-zA-Z0-9] {” + characterCount +“} $ /”); / \ / ^ [a-zA-Z0-9] {7} $ /// requestShipmentDirectives.js:76 false main.js:46 Uncaught TypeError:无法读取null的属性“ offsetWidth”这是我做的事情RegEx Dynamic。
Ankit Tanna 2015年

31

要从JavaScript中的变量构建正则表达式,您需要使用RegExp带有字符串参数的构造函数。

function reg(input) {
    var flags;
    //could be any combination of 'g', 'i', and 'm'
    flags = 'g';
    return new RegExp('ReGeX' + input + 'ReGeX', flags);
}

当然,这是一个非常幼稚的例子。假定input已经对正则表达式进行了正确的转义。如果您要处理用户输入,或者只是想使其更方便地匹配特殊字符,则需要转义特殊字符

function regexEscape(str) {
    return str.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')
}

function reg(input) {
    var flags;
    //could be any combination of 'g', 'i', and 'm'
    flags = 'g';
    input = regexEscape(input);
    return new RegExp('ReGeX' + input + 'ReGeX', flags);
}

这对我有用的唯一方法是删除ReGeX文本。因此,我使用了:return new RegExp(input, flags);
Michael Rader

2
@MichaelRader,是的,“ ReGeX”文本是问题的一部分,仅用作示例,而不是使代码正常工作所需的内容。
zzzzBov

1
大声笑只是意识到那只是您的占位符,但是作为菜鸟,这花了我一段时间。谢谢。
Michael Rader

我知道为什么字符串需要转义。但是,为什么“\\ $&”被用作替换
谢林BINU

2
\\表示单个\字符,$&是匹配的子字符串
zzzzBov

7

如果您使用的是es6 模板文字,则可以选择...

string.replace(new RegExp(`ReGeX${testVar}ReGeX`), "replacement")

它不适用于模板文字。我正在使用正则表达式来验证我的应用程序中的密码,并且我想对正则表达式字符串中的最大和最小长度进行参数设置,但这是行不通的。``const newRegExp =新的RegExp(^[^\s]{${4},${32}}$); 导出const validatePassword = value => value.match(newRegExp); ```
p7adams

6

您总是可以将正则表达式指定为字符串,即 "ReGeX" + testVar + "ReGeX"。您可能必须在字符串中转义一些字符(例如,双引号),但是在大多数情况下,这是等效的。

您还可以使用RegExp构造函数来传递标志(请参阅docs)。


3

您可以通过以下两种方式之一在JS中创建正则表达式:

  1. 使用正则表达式文字- /ab{2}/g
  2. 使用正则表达式构造函数- new RegExp("ab{2}", "g")

正则表达式文字是常量,不能与变量一起使用。这可以使用构造函数来实现。RegEx构造函数的结构是

new RegExp(regularExpressionString, modifiersString)

您可以将变量嵌入为regularExpressionString的一部分。例如,

var pattern="cd"
var repeats=3
new RegExp(`${pattern}{${repeats}}`, "g") 

这将匹配该模式的任何外观cdcdcd


2

这是一个非常无用的函数,它返回由特定字符包装的值。:)

jsfiddle:https ://jsfiddle.net/squadjot/43agwo6x/

function getValsWrappedIn(str,c1,c2){
    var rg = new RegExp("(?<=\\"+c1+")(.*?)(?=\\"+c2+")","g"); 
    return str.match(rg);
    }

var exampleStr = "Something (5) or some time (19) or maybe a (thingy)";
var results =  getValsWrappedIn(exampleStr,"(",")")

// Will return array ["5","19","thingy"]
console.log(results)

2

接受的答案对我不起作用,也不遵循 MDN示例

请参阅上方链接中的“说明”部分

我会考虑以下对我有用的东西:

let stringThatIsGoingToChange = 'findMe';
let flagsYouWant = 'gi' //simple string with flags
let dynamicRegExp = new RegExp(`${stringThatIsGoingToChange}`, flagsYouWant)

// that makes dynamicRegExp = /findMe/gi

1
它仍然有效。问题是“ ReGeX” + testVar +“ ReGeX”使解决方案令人困惑。在我看来,添加一个实际的示例将使事情变得清晰。var testVar ='321'; var regex = new RegExp(“ [” + testVar +“] {2}”,“ g”); //等于/ [321] {2} / g
HelloWorldPeace,

1

只需要先准备字符串变量,然后将其转换为RegEx。

例如:

您要向RegEx 添加minLength并将MaxLength其与变量:

function getRegEx() {
    const minLength = "5"; // for exapmle: min is 5
    const maxLength = "12"; // for exapmle: man is 12

    var regEx = "^.{" + minLength + ","+ maxLength +"}$"; // first we make a String variable of our RegEx
    regEx = new RegExp(regEx, "g"); // now we convert it to RegEx

    return regEx; // In the end, we return the RegEx
}

现在,如果您更改MaxLength或的值MinLength,它将在所有RegEx中更改。

希望有用。也对我的英语感到抱歉。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.