Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript正则表达式:如何将变量放入正则表达式中?_Javascript_Regex_Variables - Fatal编程技术网

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

Javascript正则表达式:如何将变量放入正则表达式中?,javascript,regex,variables,Javascript,Regex,Variables,例如: function(input){ var testVar = input; string = ... string.replace(/ReGeX + testVar + ReGeX/, "replacement") } 但这当然行不通:) 有什么方法可以做到这一点吗?您可以始终将正则表达式设置为字符串,即“ReGeX”+testVar+“ReGeX”。您可能需要转义字符串中的某些字符(例如,双引号),但在大多数情况下,它是等效的 您还可以使用RegExp构造函数

例如:

function(input){
    var testVar = input;
    string = ...
    string.replace(/ReGeX + testVar + ReGeX/, "replacement")
}
但这当然行不通:)
有什么方法可以做到这一点吗?

您可以始终将正则表达式设置为字符串,即
“ReGeX”+testVar+“ReGeX”
。您可能需要转义字符串中的某些字符(例如,双引号),但在大多数情况下,它是等效的

您还可以使用
RegExp
构造函数在()中传递标志

更新 根据一些评论,重要的是要注意,如果存在潜在的恶意内容(例如,变量来自用户输入),则可能需要删除该变量

ES6更新 2019年,这通常使用模板字符串编写,并且上述代码已经更新。原来的答案是:

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

您可以使用RegExp对象:

var regexstring = "whatever";
var regexp = new RegExp(regexstring, "gi");
var str = "whateverTest";
var str2 = str.replace(regexp, "other");
document.write(str2);
然后,您可以以任何方式构造
regexstring


您可以阅读更多信息。

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

function reg(input) {
    var flags;
    //could be any combination of 'g', 'i', and 'm'
    flags = 'g';
    return new RegExp('ReGeX' + input + 'ReGeX', flags);
}
当然,这是一个非常幼稚的例子。它假定正则表达式的
input
is已正确转义。如果您正在处理用户输入,或者只是想更方便地匹配特殊字符,则需要:


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

jsfiddle:

函数getValsWrappedIn(str,c1,c2){ var rg=new RegExp(“(?如果您使用的是es6是一个选项…”

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

接受的答案对我不起作用,也不符合我的要求

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

我想说的是,这对我很有用:

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

// that makes dynamicRegExp = /findMe/gi

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

  • 使用正则表达式literal-
    /ab{2}/g
  • 使用正则表达式构造函数-
    newregexp(“ab{2}”,“g”)
  • 正则表达式文字是常量,不能与变量一起使用。这可以通过使用构造函数来实现。正则表达式构造函数的结构是

    new RegExp(regularExpressionString, modifiersString)
    
    您可以将变量作为regularExpressionString的一部分嵌入。例如

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

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

    只需先准备字符串变量,然后将其转换为正则表达式即可

    例如:

    function(input){
        var testVar = input;
        string = ...
        string.replace(/ReGeX + testVar + ReGeX/, "replacement")
    }
    
    您想将
    minLength
    MaxLength
    以及变量添加到RegEx:

    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”?它是变量名吗?它暗示它是RegExp构造的一部分,从而使答案混淆(以防读者没有看到问题中那些奇怪的字符)var characterCount=parseInt(attrs.limitCharacterCount);console.log(characterCount);var specialCharactersValidation=new RegExp(“/^[a-zA-Z0-9]{“+characterCount+”}$/”;/\/^[a-zA-Z0-9]{7}$\//RequestShipmentDirections.js:76 false main.js:46 Uncaught TypeError:无法读取null的属性'offsetWidth'。这是在我将正则表达式设置为动态时发生的情况。请确保转义您的字符串!请参阅@zzzzBov answer这在我的情况下不起作用,您能看一看,并让我知道如果我想设置国家/地区,我必须做些什么吗将代码动态转换为
    regex
    expression需要记住的一件重要事情是,在正则字符串中,\字符需要转义,而在regex文本中,/字符(通常)需要转义。因此
    /\w+\//i
    成为
    新的RegExp(“\\w+/”,“i”)
    如何处理/g?伙计们,我需要拆分这个regex/[^0-9.]/g由两部分组成:/[^0-9和-]/g如何做?对我来说唯一有效的方法是删除
    ReGeX
    文本。因此我使用:
    返回新的RegExp(输入,标志);
    @MichaelRader,是的,“ReGeX”"文本是问题的一部分,并用作示例,而不是使代码正常工作所需的东西。lol刚刚意识到这只是您的占位符,但作为一个noob,我花了一段时间才弄明白。谢谢。我理解为什么需要对字符串进行转义。但为什么使用“\\$&”替换
    \\\
    表示单个
    \
    >问题是'ReGeX'+testVar+'ReGeX'会让解决方案变得混乱。在我看来,添加一个实际的例子会让事情变得更清楚。var testVar='321';var ReGeX=new RegExp(“[”+testVar+“]{2}”,“g”);//以上等价于/[321]{2}/git不适用于模板文本。我在应用程序中使用regexp验证密码,我想参数化正则表达式字符串中的最大和最小长度,但它不起作用。``const newRegExp=newRegExp(
    ^[^\s]{${4},${32}$
    );export const validatePassword=value=>value.match(newRegExp)```
    var pattern="cd"
    var repeats=3
    new RegExp(`${pattern}{${repeats}}`, "g") 
    
    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
    }