RegExp.escape()

基准线 2025
新推出

自 2025 年 5 月起,此功能适用于最新的设备和浏览器版本。此功能可能不适用于较旧的设备或浏览器。

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

浏览器兼容性

另见