【问题标题】:Javascript Regex: How to put a variable inside a regular expression? [duplicate]Javascript Regex:如何将变量放入正则表达式中? [复制]
【发布时间】:2022-01-04 16:54:35
【问题描述】:

例如:

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

但这当然行不通 :) 有没有办法做到这一点?

【问题讨论】:

  • 请注意,如果您让用户提供此变量,恶意用户很容易通过灾难性的回溯使您的应用程序崩溃。
  • 什么是“ReGeX”?它是一个变量名吗?它暗示它是 RegExp 构造的一部分,从而使答案令人困惑(以防读者在问题中没有看到那些奇怪的字符)。

标签: javascript regex variables


【解决方案1】:
const regex = new RegExp(`ReGeX${testVar}ReGeX`);
...
string.replace(regex, "replacement");

更新

对于某些 cmets,请务必注意,如果可能存在恶意内容(例如,变量来自用户输入),您可能需要 escape变量

ES6 更新

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

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

【讨论】:

  • 确保转义你的字符串!请参阅@zzzzBov 答案
  • 这在我的情况下不起作用,您能看看this jsfiddle,如果我想将国家代码动态设置为regex 表达式,我需要做什么
  • 要记住的重要一点是,在常规字符串中,\ 字符需要转义,而在正则表达式文字中(通常),/ 字符需要转义。所以/\w+\//i 变成了new RegExp("\\w+/", "i")
  • /g 怎么样?
  • 各位,我需要把这个正则表达式 /[^0-9.-]/g 分成两部分: /[^0-9 和 -]/g 怎么做?
【解决方案2】:

您可以使用 RegExp 对象:

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

然后你可以用任何你想要的方式构造regexstring

您可以阅读更多关于它的信息here

【讨论】:

  • 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: Cannot read property 'offsetWidth' of null 这是我做的时候发生的事情正则表达式动态。
【解决方案3】:

要从 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 已被正确转义为正则表达式。如果你正在处理用户输入,或者只是想让匹配特殊字符更方便,你需要escape special characters

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);
  • @MichaelRader,是的,“ReGeX”文本是问题的一部分并用作示例,而不是使代码工作所需的内容。
  • 大声笑刚刚意识到这只是你的占位符,但作为一个菜鸟,我花了一段时间才弄清楚。谢谢。
  • 我明白为什么需要对字符串进行转义。但是为什么使用'\\$&'作为替代品
  • \\ 表示单个 \ 字符,$& is the matched substring
【解决方案4】:

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

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

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

new RegExp(regularExpressionString, modifiersString)

您可以将变量嵌入到正则表达式字符串中。例如,

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

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

【讨论】:

    【解决方案5】:

    如果您使用的是 es6,template literals 是一个选项...

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

    【讨论】:

    • 它不适用于模板文字。我正在使用正则表达式来验证我的应用程序中的密码,我想在我的正则表达式字符串中参数化最大和最小长度,但它不起作用。 ``` const newRegExp = new RegExp(^[^\s]{${4},${32}}$);导出 const validatePassword = value => value.match(newRegExp); ```
    【解决方案6】:

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

    您还可以使用RegExp 构造函数将标志传入 (see the docs)。

    【讨论】:

      【解决方案7】:

      只需要先准备好字符串变量,再转换成RegEx即可。

      例如:

      您想将带有变量的 minLengthMaxLength 添加到 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
      }
      

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

      希望有用。也对不起我的英语。

      【讨论】:

        【解决方案8】:

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

        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)
        

        【讨论】:

          【解决方案9】:

          接受的答案对我不起作用,也没有关注MDN examples

          请参阅上面链接中的“描述”部分

          我会选择以下对我有用的方法:

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

          【讨论】:

          • 它仍然有效。问题是 'ReGeX' + testVar +' ReGeX' 使解决方案令人困惑。在我看来,添加一个实际示例可以解决问题。 var testVar = '321'; var regex = new RegExp("[" + testVar + "]{2}", "g" ); // 以上等价于 /[321]{2}/g
          猜你喜欢
          • 1970-01-01
          • 2011-08-08
          • 2011-10-26
          • 2012-12-30
          • 2020-06-09
          • 2012-11-18
          • 2012-01-24
          相关资源
          最近更新 更多