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

Posted

技术标签:

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

例如:

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

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

【问题讨论】:

请注意,如果您让用户提供此变量,恶意用户很容易通过灾难性的回溯使您的应用程序崩溃。 什么是“ReGeX”?它是一个变量名吗?它暗示它是 RegExp 构造的一部分,从而使答案令人困惑(以防读者在问题中没有看到那些奇怪的字符)。 【参考方案1】:
const regex = new RegExp(`ReGeX$testVarReGeX`);
...
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 中创建正则表达式:

    使用正则表达式文字 - /ab2/g 使用正则表达式构造函数 - new RegExp("ab2", "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$testVarReGeX`), "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

以上是关于Javascript Regex:如何将变量放入正则表达式中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

将多个 PHP 变量放入 Javascript 数组

用于匹配正整数和负整数的 Javascript RegEx [重复]

如何将数据库的行号放入变量中

如何在 Zeppelin 的 javascript 中将变量放入 z ZeppelinContext?

如何使用 javascript 在 regExp 中使用动态变量? [复制]

如何在 C# 中读取正则表达式捕获