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即可。
例如:
您想将带有变量的 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 中更改。
希望有用。也对不起我的英语。
【讨论】:
【参考方案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:如何将变量放入正则表达式中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
用于匹配正整数和负整数的 Javascript RegEx [重复]
如何在 Zeppelin 的 javascript 中将变量放入 z ZeppelinContext?