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

Ada*_*dam 183 javascript regex variables

例如:

function(input){
    var testVar = input;
    string = ...
    string.replace(/ReGeX + testVar + ReGeX/, "replacement")
}
Run Code Online (Sandbox Code Playgroud)

但这当然不起作用:)有没有办法做到这一点?

Jas*_*ary 249

var regex = new RegExp("ReGeX" + testVar + "ReGeX");
...
string.replace(regex, "replacement");
Run Code Online (Sandbox Code Playgroud)

更新

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

  • 需要记住的一件重要事情是,在常规字符串中,\ _字符需要在正则表达式文字中进行转义(通常)/字符需要转义.所以`/\w +\// i`变成`new RegExp("\\ w + /","i")` (8认同)
  • 一定要逃避你的绳子!见@zzzzBov答案 (5认同)
  • /g 怎么样? (3认同)

ste*_*nar 75

您可以使用RegExp对象:

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

然后你可以regexstring以任何你想要的方式构建.

你可以在这里阅读更多相关信息.


zzz*_*Bov 30

要从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);
}
Run Code Online (Sandbox Code Playgroud)

当然,这是一个非常天真的例子.它假定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);
}
Run Code Online (Sandbox Code Playgroud)

  • @MichaelRader,是的,“ ReGeX”文本是问题的一部分,仅用作示例,而不是使代码正常工作所必需的。 (2认同)
  • 大声笑刚刚意识到这只是你的占位符,但作为一个菜鸟,我花了一段时间才弄清楚。谢谢。 (2认同)
  • ``\\`` 代表单个``\`` 字符,[`$&` 是匹配的子串](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects /String/replace#Specifying_a_string_as_a_parameter)。 (2认同)

Ben*_*arp 9

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

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

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

new RegExp(regularExpressionString, modifiersString)
Run Code Online (Sandbox Code Playgroud)

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

var pattern="cd"
var repeats=3
new RegExp(`${pattern}{${repeats}}`, "g") 
Run Code Online (Sandbox Code Playgroud)

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


shu*_*111 7

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

string.replace(new RegExp(`ReGeX${testVar}ReGeX`), "replacement")
Run Code Online (Sandbox Code Playgroud)


Nik*_*bak 6

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

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