RegExp.escape()
Baseline Недавно доступно
Эта функция работает на последних устройствах и версиях браузеров. Эта функция может не работать на старых устройствах или версиях браузеров. Она доступна во всех браузерах с мая 2025 года.
Статический метод RegExp.escape() экранирует любые потенциальные символы синтаксиса регулярных выражений в строке и возвращает новую строку, которую можно безопасно использовать как литеральный шаблон для конструктора RegExp().
При динамическом создании RegExp с пользовательским контентом рассмотрите возможность использования этой функции для очистки ввода (если только ввод действительно не предназначен для содержания синтаксиса регулярных выражений). Кроме того, не пытайтесь переопределить ее функциональность, например, используя String.prototype.replaceAll() для вставки \ перед всеми символами синтаксиса. RegExp.escape() разработан для использования escape-последовательностей, которые работают во многих других крайних случаях/контекстах, чем тот, которого, вероятно, удастся достичь с помощью самописного кода.
Синтаксис
RegExp.escape(string)
Параметры
-
string - Строка для экранирования.
Возвращаемое значение
Новая строка, которую можно безопасно использовать как литеральный шаблон для конструктора RegExp(). А именно, заменяются следующие элементы во входной строке:
- Первый символ строки, если он является десятичной цифрой (0–9) или буквой ASCII (a–z, A–Z), экранируется с использованием синтаксиса экранирования символов
\x. Например,RegExp.escape("foo")возвращает"\\x66oo"(здесь и далее два обратных слэша в строковом литерале обозначают один символ обратного слэша). Этот шаг гарантирует, что если эта экранированная строка встроена в более крупный шаблон, которому непосредственно предшествует\1,\x0,\u000и т. д., начальный символ не будет интерпретирован как часть escape-последовательности. - Символы синтаксиса регулярных выражений, включая
^,$,\,.,*,+,?,(,),[,],{,}и|, а также разделитель/, экранируются путем вставки символа\перед ними. Например,RegExp.escape("foo.bar")возвращает"\\x66oo\\.bar", аRegExp.escape("(foo)")возвращает"\\(foo\\)". - Другие пунктуаторы, включая
,,-,=,<,>,#,&,!,%,:,;,@,~,',`и", экранируются с использованием синтаксиса\x. Например,RegExp.escape("foo-bar")возвращает"\\x66oo\\x2dbar". Эти символы не могут быть экранированы путем префикса\, потому что, например,/foo\-bar/uявляется синтаксической ошибкой. - Символы с собственными escape-последовательностями символов:
\f(U+000C FORM FEED),\n(U+000A LINE FEED),\r(U+000D CARRIAGE RETURN),\t(U+0009 CHARACTER TABULATION) и\v(U+000B LINE TABULATION), заменяются их escape-последовательностями. Например,RegExp.escape("foo\nbar")возвращает"\\x66oo\\nbar". - Символ пробела экранируется как
"\\x20". - Другие не-ASCII символы переноса строки и пробела заменяются одной или двумя escape-последовательностями
\uXXXX, представляющими их UTF-16 кодовые единицы. Например,RegExp.escape("foo\u2028bar")возвращает"\\x66oo\\u2028bar". -
Одиночные суррогаты заменяются их escape-последовательностями
\uXXXX. Например,RegExp.escape("foo\uD800bar")возвращает"\\x66oo\\ud800bar".
Исключения
-
TypeError - Выбрасывается, если
stringне является строкой.
Примеры
Использование RegExp.escape()
Следующие примеры демонстрируют различные входные данные и результаты для метода RegExp.escape().
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.escape() с конструктором RegExp
Основной сценарий использования RegExp.escape() заключается в том, когда вы хотите встроить строку в более крупный шаблон регулярного выражения, и вы хотите гарантировать, что строка будет рассматриваться как литеральный шаблон, а не как синтаксис регулярного выражения. Рассмотрите следующий наивный пример, который заменяет URL-адреса:
function removeDomain(text, domain) {
return text.replace(new RegExp(`https?://${domain}(?=/)`, "g"), "");
}
const input =
"Consider using [RegExp.escape()](https://developer.mozilla.org/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?://developer.mozilla.org(?=/), где символ "." является шаблонным символом регулярного выражения. Это означает, что строка будет соответствовать любой строке с любым символом вместо ".", например developer-mozilla-org. Поэтому он некорректно изменит также следующий текст:
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(), чтобы гарантировать, что любой ввод пользователя будет рассматриваться как литеральный шаблон:
function removeDomain(text, domain) {
return text.replace(
new RegExp(`https?://${RegExp.escape(domain)}(?=/)`, "g"),
"",
);
}
Теперь эта функция будет делать именно то, что мы намеревались, и не будет трансформировать developer-mozilla.org URL-адреса.
Спецификации
Совместимость с браузерами
| Desktop | Mobile | Server | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
escape |
136 |
136 |
134 |
121 |
18.2 |
136 |
134 |
90 |
18.2 |
29.0 |
136 |
18.2 |
1.1.22 |
2.3.2 |
24.0.0 |
См. также
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/escape