JavaScript中是否有RegExp.escape函数?

JavaScript中是否有RegExp.escape函数?,javascript,regex,Javascript,Regex,我只想用任何可能的字符串创建一个正则表达式 var usersString = "Hello?!*`~World()[]"; var expression = new RegExp(RegExp.escape(usersString)) var matches = "Hello".match(expression); 有内置的方法吗?如果没有,人们使用什么?鲁比有。我不觉得我需要写我自己的,必须有一些标准的东西。在另一个答案中链接的函数是不够的。它无法转

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

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

有内置的方法吗?如果没有,人们使用什么?鲁比有。我不觉得我需要写我自己的,必须有一些标准的东西。

在另一个答案中链接的函数是不够的。它无法转义字符组中用于范围的
^
$
(字符串的开始和结束)或
-

使用此功能:

function escapeRegex(string) {
    return string.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
}
function escapeRegExp(string) {
  return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}
虽然乍一看似乎没有必要,但转义
-
(以及
^
)使函数适合转义要插入字符类以及正则表达式主体中的字符

转义
/
使函数适合转义JavaScript正则表达式文本中使用的字符,以供以后评估

因为逃避这两种情况都没有坏处,所以逃避以涵盖更广泛的用例是有意义的


是的,这不是标准JavaScript的一部分,这是一个令人失望的失败。

在jQueryUI的自动完成小部件(版本1.9.1)中,他们使用了一个稍微不同的正则表达式(第6753行),下面是正则表达式与JavaScript的组合


这是一个较短的版本

RegExp.escape = function(s) {
    return s.replace(/[$-\/?[-^{|}]/g, '\\$&');
}
这包括
%
&
'
的非元字符,但JavaScript RegExp规范允许此操作。

提供此转义函数:

function escapeRegex(string) {
    return string.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
}
function escapeRegExp(string) {
  return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}

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

如果您转义整个regexp并使用它,则引用独立(
+
*
^
$
\
)的元字符或启动某个东西(
){/code>)就是您所需要的:

String.prototype.regexEscape = function regexEscape() {
  return this.replace(/[.?+*^$|({[\\]/g, '\\$&');
};
是的,令人失望的是JavaScript没有这样的内置函数。

对于任何使用Lodash的人来说,函数是内置的:

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

而且,如果您不需要完整的Lodash库,您可能需要!

这里的大多数表达式都解决单个特定的用例

没关系,但我更喜欢“永远有效”的方法

function regExpEscape(literal_string) {
    return literal_string.replace(/[-[\]{}()*+!<=:?.\/\\^$|#\s,]/g, '\\$&');
}
此函数将转义所有字符,但明确保证不会在将来的正则表达式风格中用于语法的字符除外


对于真正的卫生敏感,考虑这一边缘情况:

var s = '';
new RegExp('(choice1|choice2|' + regExpEscape(s) + ')');
这在JavaScript中应该可以很好地编译,但在某些其他版本中不会。如果打算传递到另一个版本,则应单独检查
s==''
的null大小写,如下所示:

var s = '';
new RegExp('(choice1|choice2' + (s ? '|' + regExpEscape(s) : '') + ')');

有一个关于RegExp.escape at的建议,其polyfill可在处使用。

没有任何东西可以阻止您仅转义每个非字母数字字符:

usersString.replace(/(?=\W)/g, '\\');
在执行
re.toString()
时,您会失去一定程度的可读性,但您获得了大量的简单性(和安全性)


根据ECMA-262,一方面,正则表达式“语法字符”总是非字母数字的,因此结果是安全的,而特殊转义序列(
\d
\w
\n
)总是字母数字的,因此不会产生错误的控件转义。

function escapeRegex(string) {
    return string.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
}
function escapeRegExp(string) {
  return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}
XRegExp.escape('Escaped?');
//->“逃逸\?\”


更多的是:

而不是只逃避在正则表达式中引起问题的字符(例如:黑名单),而是考虑使用白名单。这样,每个字符都被认为是不匹配的,除非

对于本例,假设以下表达式:

RegExp.escape('be || ! be');
此白名单包括字母、数字和空格:

RegExp.escape = function (string) {
    return string.replace(/([^\w\d\s])/gi, '\\$1');
}
返回:

"be \|\| \! be"
这可能会转义不需要转义的字符,但这不会妨碍您的表达式(可能会有一些小的时间损失,但出于安全考虑,这是值得的)。

另一种(更安全的)方法是使用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');

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

不管对转义字符串做了什么,插入到平衡的正则表达式包装器中,还是追加,都无关紧要

用这个替换字符串吗

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

有一个针对RegExp.escape at的ES7提案,其中一个polyfill可在

以被拒绝的ES提案为基础的示例包括检查该财产是否已经存在,以防TC39回溯其决定


代码:

代码缩小:

Object.prototype.hasOwnProperty.call(RegExp,"escape")||(RegExp.escape=function(e){return e.replace(/[.*+\-?^${}()|[\]\\]/g,"\\$&")});


在以下位置还有一个
npm
模块:


您可以安装并按如下方式使用它:



GitHub&&NPM页面中还描述了如何使用此选项的填充/多边形填充。该逻辑基于
return RegExp.escape | | implementation;
,其中实现包含上面使用的RegExp



NPM模块是一个额外的依赖项,但它也使外部参与者更容易识别添加到代码中的逻辑部分\(ツ)/“

实际上,我们不需要在all@Paul:Perl
quotemeta
\Q
),Python
re.escape
,PHP
preg\u quote
,Ruby
Regexp.quote
…如果要在循环中使用此函数,最好将Regexp对象设为自己的变量
var e=/[\-\[\]\/\{}\(\)\*\+\?\.\\^\$\\\\\\\\;]/g;
然后您的函数是
返回s.replace(e,'\\$&');
这样您只实例化一次RegExp。标准argum
// ...
var assert = require('assert');
 
var str = 'hello. how are you?';
var regex = new RegExp(RegExp.escape(str), 'g');
assert.equal(String(regex), '/hello\. how are you\?/g');
npm install regexp.escape
yarn add regexp.escape
var escape = require('regexp.escape');
var assert = require('assert');
 
var str = 'hello. how are you?';
var regex = new RegExp(escape(str), 'g');
assert.equal(String(regex), '/hello\. how are you\?/g');