RegExp.escape()
RegExp.escape() 静态方法 转义 字符串中任何潜在的正则表达式语法字符,并返回一个可以安全用作 字面量 模式的字符串,供 RegExp() 构造函数使用。
在动态创建 RegExp 对象(包含用户提供的内容)时,请考虑使用此函数来清理输入(除非输入实际上是要包含正则表达式语法)。此外,请勿尝试通过例如使用 String.prototype.replaceAll() 在所有语法字符前插入 \ 来重新实现其功能。RegExp.escape() 设计用于使用在许多更极端的用例/上下文中都有效的转义序列,这比手工编写的代码可能难以实现。
语法
js
RegExp.escape(string)
参数
string-
要转义的字符串。
返回值
一个可以安全用作 RegExp() 构造函数字面量模式的新字符串。具体来说,输入字符串中的以下内容将被替换:
- 字符串的第一个字符,如果它是十进制数字 (0–9) 或 ASCII 字母 (a–z, A–Z),则使用
\x字符转义 语法进行转义。例如,RegExp.escape("foo")返回"\\x66oo"(此处及以下,字符串字面量中的两个反斜杠表示一个反斜杠字符)。此步骤确保,如果此转义后的字符串嵌入到更大的模式中,并且其前面紧跟着\1、\x0、\u000等,则前导字符不会被解释为转义序列的一部分。 - 正则表达式 语法字符,包括
^、$、\、.、*、+、?、(、)、[、]、{、}和|,以及/分隔符,将通过在其前面插入\字符来转义。例如,RegExp.escape("foo.bar")返回"\\x66oo\\.bar",而RegExp.escape("(foo)")返回"\\(foo\\)"。 - 其他标点符号,包括
,、-、=、<、>、#、&、!、%、:、;、@、~、'、`和",将使用\x语法进行转义。例如,RegExp.escape("foo-bar")返回"\\x66oo\\x2dbar"。这些字符不能通过在前面加上\来转义,因为例如/foo\-bar/u是语法错误。 - 具有自身 字符转义 序列的字符:
\f(U+000C 换页符)、\n(U+000A 换行符)、\r(U+000D 回车符)、\t(U+0009 水平制表符) 和\v(U+000B 垂直制表符),将被替换为其转义序列。例如,RegExp.escape("foo\nbar")返回"\\x66oo\\nbar"。 - 空格字符被转义为
"\\x20"。 - 其他非 ASCII 换行符和空格字符 将被替换为表示其 UTF-16 码位的 \uXXXX 转义序列。例如,
RegExp.escape("foo\u2028bar")返回"\\x66oo\\u2028bar"。 - 孤立的代理对 将被替换为它们的
\uXXXX转义序列。例如,RegExp.escape("foo\uD800bar")返回"\\x66oo\\ud800bar"。
异常
TypeError-
如果
string不是字符串,则抛出错误。
示例
使用 RegExp.escape()
以下示例演示了 RegExp.escape() 方法的各种输入和输出。
js
RegExp.escape("Buy it. use it. break it. fix it.");
// "\\x42uy\\x20it\\.\\x20use\\x20it\\.\\x20break\\x20it\\.\\x20fix\\x20it\\."
RegExp.escape("foo.bar"); // "\\x66oo\\.bar"
RegExp.escape("foo-bar"); // "\\x66oo\\x2dbar"
RegExp.escape("foo\nbar"); // "\\x66oo\\nbar"
RegExp.escape("foo\uD800bar"); // "\\x66oo\\ud800bar"
RegExp.escape("foo\u2028bar"); // "\\x66oo\\u2028bar"
在 RegExp 构造函数中使用 RegExp.escape()
RegExp.escape() 的主要用例是当您想将一个字符串嵌入到更大的正则表达式模式中,并且您想确保该字符串被视为字面量模式,而不是正则表达式语法。考虑以下替换 URL 的简单示例:
js
function removeDomain(text, domain) {
return text.replace(new RegExp(`https?://${domain}(?=/)`, "g"), "");
}
const input =
"Consider using [RegExp.escape()](https://mdn.org.cn/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/escape) to escape special characters in a string.";
const domain = "developer.mozilla.org";
console.log(removeDomain(input, domain));
// Consider using [RegExp.escape()](/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/escape) to escape special characters in a string.
上面插入 domain 导致正则表达式字面量为 https?://mdn.org.cn(?=/),其中 "." 字符是正则表达式 通配符 字符。这意味着该字符串将匹配字符串中任何字符代替 "." 的情况,例如 developer-mozilla-org。因此,它还会错误地更改以下文本:
js
const input =
"This is not an MDN link: https://developer-mozilla.org/, be careful!";
const domain = "developer.mozilla.org";
console.log(removeDomain(input, domain));
// This is not an MDN link: /, be careful!
为了解决这个问题,我们可以使用 RegExp.escape() 来确保任何用户输入都被视为字面量模式:
js
function removeDomain(text, domain) {
return text.replace(
new RegExp(`https?://${RegExp.escape(domain)}(?=/)`, "g"),
"",
);
}
现在,此函数将完全按照我们的意图进行操作,并且不会转换 developer-mozilla.org URL。
规范
| 规范 |
|---|
| ECMAScript® 2026 语言规范 # sec-regexp.escape |
浏览器兼容性
加载中…