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.club.tw/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.club.tw(?=/),其中 "." 字元是正則表示式 萬用字元 字元。這意味著該字串將匹配字串中任何字元代替 "." 的情況,例如 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

瀏覽器相容性

另見