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.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 |
瀏覽器相容性
載入中…