RegExp.escape()

Baseline 2025
Newly available

Since May 2025, this feature works across the latest devices and browser versions. This feature might not work in older devices or browsers.

Phương thức tĩnh RegExp.escape() escape mọi ký tự có thể là cú pháp regex trong một chuỗi, và trả về một chuỗi mới có thể được dùng an toàn như một pattern literal cho constructor RegExp().

Khi tạo động một RegExp từ nội dung do người dùng cung cấp, hãy cân nhắc dùng hàm này để làm sạch đầu vào (trừ khi đầu vào thực sự được thiết kế để chứa cú pháp regex). Ngoài ra, đừng cố tái tạo chức năng của nó bằng cách, ví dụ, dùng String.prototype.replaceAll() để chèn \ trước mọi ký tự cú pháp. RegExp.escape() được thiết kế để sử dụng các escape sequence hoạt động đúng trong nhiều trường hợp biên/ngữ cảnh hơn những gì code viết tay có thể đạt được.

Cú pháp

js
RegExp.escape(string)

Tham số

string

Chuỗi cần escape.

Giá trị trả về

Một chuỗi mới có thể được dùng an toàn như một pattern literal cho constructor RegExp(). Cụ thể, các thành phần sau trong chuỗi đầu vào sẽ được thay thế:

  • Ký tự đầu tiên của chuỗi, nếu là chữ số thập phân (0–9) hoặc chữ cái ASCII (a–z, A–Z), được escape bằng cú pháp character escape \x. Ví dụ, RegExp.escape("foo") trả về "\\x66oo" (ở đây và sau đây, hai dấu gạch chéo ngược trong chuỗi literal biểu thị một ký tự gạch chéo ngược đơn). Bước này đảm bảo rằng nếu chuỗi đã escape này được nhúng vào một pattern lớn hơn mà ngay trước nó là \1, \x0, \u000, v.v., ký tự đầu không bị hiểu là một phần của escape sequence.
  • Ký tự cú pháp regex, bao gồm ^, $, \, ., *, +, ?, (, ), [, ], {, }, và |, cũng như dấu phân cách /, được escape bằng cách chèn ký tự \ trước chúng. Ví dụ, RegExp.escape("foo.bar") trả về "\\x66oo\\.bar", và RegExp.escape("(foo)") trả về "\\(foo\\)".
  • Các dấu câu khác, bao gồm ,, -, =, <, >, #, &, !, %, :, ;, @, ~, ', `, và ", được escape bằng cú pháp \x. Ví dụ, RegExp.escape("foo-bar") trả về "\\x66oo\\x2dbar". Các ký tự này không thể escape bằng cách thêm \ vì, ví dụ, /foo\-bar/u là lỗi cú pháp.
  • Các ký tự có character escape riêng: \f (U+000C FORM FEED), \n (U+000A LINE FEED), \r (U+000D CARRIAGE RETURN), \t (U+0009 CHARACTER TABULATION), và \v (U+000B LINE TABULATION), được thay thế bằng escape sequence tương ứng. Ví dụ, RegExp.escape("foo\nbar") trả về "\\x66oo\\nbar".
  • Ký tự khoảng trắng được escape thành "\\x20".
  • Các ký tự ngắt dòng và khoảng trắng non-ASCII khác được thay thế bằng một hoặc hai escape sequence \uXXXX biểu thị các đơn vị mã UTF-16 của chúng. Ví dụ, RegExp.escape("foo\u2028bar") trả về "\\x66oo\\u2028bar".
  • Lone surrogate được thay thế bằng escape sequence \uXXXX. Ví dụ, RegExp.escape("foo\uD800bar") trả về "\\x66oo\\ud800bar".

Ngoại lệ

TypeError

Được ném ra nếu string không phải là chuỗi.

Ví dụ

Sử dụng RegExp.escape()

Các ví dụ sau minh họa nhiều đầu vào và đầu ra khác nhau của phương thức 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"

Sử dụng RegExp.escape() với constructor RegExp

Trường hợp sử dụng chính của RegExp.escape() là khi bạn muốn nhúng một chuỗi vào một pattern regex lớn hơn và muốn đảm bảo chuỗi đó được xử lý như một pattern literal, không phải cú pháp regex. Xem xét ví dụ đơn giản sau đây thay thế URL:

js
function removeDomain(text, domain) {
  return text.replace(new RegExp(`https?://${domain}(?=/)`, "g"), "");
}

const input =
  "Consider using [RegExp.escape()](https://mdn.go-mizu.dev/vi/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()](/vi/docs/Web/JavaScript/Reference/Global_Objects/RegExp/escape) to escape special characters in a string.

Việc chèn domain ở trên tạo ra regex literal https?://developer.mozilla.org(?=/), trong đó ký tự "." là ký tự wildcard của regex. Điều này có nghĩa là chuỗi sẽ khớp với chuỗi có bất kỳ ký tự nào thay cho ".", chẳng hạn developer-mozilla-org. Do đó, nó sẽ cũng thay đổi nhầm đoạn văn bản sau:

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!

Để sửa lỗi này, chúng ta có thể dùng RegExp.escape() để đảm bảo mọi đầu vào từ người dùng được xử lý như pattern literal:

js
function removeDomain(text, domain) {
  return text.replace(
    new RegExp(`https?://${RegExp.escape(domain)}(?=/)`, "g"),
    "",
  );
}

Bây giờ hàm này sẽ thực hiện đúng như dự kiến và sẽ không biến đổi các URL developer-mozilla.org.

Thông số kỹ thuật

Specification
ECMAScript® 2027 Language Specification
# sec-regexp.escape

Tương thích trình duyệt

Xem thêm