我只是想从任何可能的字符串中创建一个正则表达式。
var usersString = "Hello?!*`~World()[]";
var expression = new RegExp(RegExp.escape(usersString))
var matches = "Hello".match(expression);
有内置的方法吗?如果不是,人们用什么?Ruby有RegExp.escape。我觉得我不需要写我自己的,必须有一些标准的东西。
我只是想从任何可能的字符串中创建一个正则表达式。
var usersString = "Hello?!*`~World()[]";
var expression = new RegExp(RegExp.escape(usersString))
var matches = "Hello".match(expression);
有内置的方法吗?如果不是,人们用什么?Ruby有RegExp.escape。我觉得我不需要写我自己的,必须有一些标准的东西。
当前回答
escapeRegExp = function(str) {
if (str == null) return '';
return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
};
其他回答
没有什么可以阻止你转义每个非字母数字字符:
usersString.replace(/(?=\W)/g, '\\');
在执行re.toString()时,您会损失一定程度的可读性,但您获得了极大的简单性(和安全性)。
根据ECMA-262,一方面,正则表达式“语法字符”总是非字母数字的,这样的结果是安全的,特殊转义序列(\d, \w, \n)总是字母数字的,这样就不会产生错误的控制转义。
对于任何使用Lodash的人来说,自从v3.0.0以来,_.escapeRegExp函数是内置的:
_.escapeRegExp('[lodash](https://lodash.com/)');
// → '\[lodash\]\(https:\/\/lodash\.com\/\)'
而且,如果您不想需要完整的Lodash库,您可能只需要该函数!
另一种(更安全的)方法是使用unicode转义格式\u{code}转义所有字符(而不仅仅是我们目前知道的一些特殊字符):
function escapeRegExp(text) {
return Array.from(text)
.map(char => `\\u{${char.charCodeAt(0).toString(16)}}`)
.join('');
}
console.log(escapeRegExp('a.b')); // '\u{61}\u{2e}\u{62}'
请注意,你需要传递u标志来让这个方法工作:
var expression = new RegExp(escapeRegExp(usersString), 'u');
这是长久之计。
function regExpEscapeFuture(literal_string) {
return literal_string.replace(/[^A-Za-z0-9_]/g, '\\$&');
}
其他答案中的函数对于转义整个正则表达式来说是多余的(它们对于转义正则表达式中稍后将连接到更大的regexp的部分可能有用)。
如果转义整个regexp并使用它,则引用独立的元字符(。, ?, +, *, ^, $, |, \) 或开始 ((, [, {) 是你所需要的:
String.prototype.regexEscape = function regexEscape() {
return this.replace(/[.?+*^$|({[\\]/g, '\\$&');
};
是的,JavaScript没有这样的内置函数是令人失望的。