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

IT技术 javascript regex variables
2021-01-22 01:46:13

例如:

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

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

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

更新

每一些评论,但你可能要很注意重要逃脱变量,如果有恶意内容的潜在(例如变量来自于用户输入)

ES6 更新

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

var regex = new RegExp("ReGeX" + testVar + "ReGeX");
...
string.replace(regex, "replacement");
一定要转义你的字符串!见@zzzzBov 答案
2021-03-16 01:46:13
/g 怎么样?
2021-03-22 01:46:13
这在我的情况下不起作用,你能看看这个 jsfiddle并让我知道如果我想将国家代码动态设置为regex表达式我必须做什么
2021-03-24 01:46:13
伙计们,我需要将这个正则表达式 /[^0-9.-]/g 分成两部分:/[^0-9 和 -]/g 怎么做?
2021-03-29 01:46:13
要记住的一件重要事情是,在常规字符串中,\ 字符需要转义,而在正则表达式文字中(通常),/ 字符需要转义。于是/\w+\//i变成new RegExp("\\w+/", "i")
2021-03-30 01:46:13

您可以使用 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: Cannot read property 'offsetWidth' of null 这就是我制作时发生的情况正则表达式动态。
2021-03-17 01:46:13

要从 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);
}

当然,这是一个非常幼稚的例子。它假设inputis 已为正则表达式正确转义。如果您正在处理用户输入,或者只是想让匹配特殊字符更方便,则需要转义特殊字符

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);
}
@MichaelRader,是的,“ReGeX”文本是问题的一部分并用作示例,而不是使代码工作所需的内容。
2021-03-15 01:46:13
我明白为什么需要转义字符串。但是为什么 '\\$&' 被用作替代
2021-03-26 01:46:13
\\表示单个\字符,$&是匹配的子串
2021-03-28 01:46:13
大声笑刚刚意识到这只是你的占位符,但作为一个菜鸟,我花了一段时间才弄清楚。谢谢。
2021-04-04 01:46:13
这对我有用的唯一方法是删除ReGeX文本。所以我使用了:return new RegExp(input, flags);
2021-04-08 01:46:13

您可以通过以下两种方式之一在 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

如果您使用 es6模板文字是一种选择...

string.replace(new RegExp(`ReGeX${testVar}ReGeX`), "replacement")
它不适用于模板文字。我正在使用正则表达式来验证我的应用程序中的密码,我想在我的正则表达式字符串中参数化最大和最小长度,但它不起作用。``` const newRegExp = new RegExp( ^[^\s]{${4},${32}}$); export const validatePassword = value => value.match(newRegExp); ``
2021-03-28 01:46:13