我只是想从任何可能的字符串中创建一个正则表达式。

var usersString = "Hello?!*`~World()[]";
var expression = new RegExp(RegExp.escape(usersString))
var matches = "Hello".match(expression);

有内置的方法吗?如果不是,人们用什么?Ruby有RegExp.escape。我觉得我不需要写我自己的,必须有一些标准的东西。


当前回答

过去和将来只有12个元字符需要转义 被认为是字面上的

对转义字符串做什么并不重要,插入到平衡的正则表达式包装器或追加。没关系。

字符串替换使用这个吗

var escaped_string = oldstring.replace(/[\\^$.|?*+()[{]/g, '\\$&');

其他回答

这是一个较短的版本。

RegExp.escape = function(s) {
    return s.replace(/[$-\/?[-^{|}]/g, '\\$&');
}

这包括%、&、'和,等非元字符,但JavaScript RegExp规范允许这样做。

在jQuery UI的自动完成小部件(版本1.9.1)中,他们使用了一个略有不同的正则表达式(第6753行),下面是正则表达式与bobince方法的结合。

RegExp.escape = function( value ) {
     return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
}

对于任何使用Lodash的人来说,自从v3.0.0以来,_.escapeRegExp函数是内置的:

_.escapeRegExp('[lodash](https://lodash.com/)');
// → '\[lodash\]\(https:\/\/lodash\.com\/\)'

而且,如果您不想需要完整的Lodash库,您可能只需要该函数!

其他答案中的函数对于转义整个正则表达式来说是多余的(它们对于转义正则表达式中稍后将连接到更大的regexp的部分可能有用)。

如果转义整个regexp并使用它,则引用独立的元字符(。, ?, +, *, ^, $, |, \) 或开始 ((, [, {) 是你所需要的:

String.prototype.regexEscape = function regexEscape() {
  return this.replace(/[.?+*^$|({[\\]/g, '\\$&');
};

是的,JavaScript没有这样的内置函数是令人失望的。

过去和将来只有12个元字符需要转义 被认为是字面上的

对转义字符串做什么并不重要,插入到平衡的正则表达式包装器或追加。没关系。

字符串替换使用这个吗

var escaped_string = oldstring.replace(/[\\^$.|?*+()[{]/g, '\\$&');