RegExp.escape в ECMAScript 2026: экранирование спецсимволов без костылей
-
В ECMAScript 2026 появился метод RegExp.escape. Он экранирует строку, чтобы её можно было безопасно использовать в регулярных выражениях. Это решает проблему ручного экранирования спецсимволов вроде точек, скобок и звездочек.
Раньше разработчики писали свои функции или тянули библиотеки, чтобы избежать ошибок. Теперь всё просто: передаёшь строку в RegExp.escape, и получаешь готовый литерал для RegExp. Это упрощает код и снижает риски уязвимостей при работе с пользовательским вводом.
Что делает RegExp.escape и зачем он нужен
Метод RegExp.escape берёт обычную строку и заменяет все потенциально специальные символы регулярных выражений на их экранированные версии. Например, точка превращается в ., скобки - в ( и ). Это нужно, когда строка из внешнего источника вставляется в RegExp как литерал.
Без экранирования спецсимволы интерпретируются как метасимволы: точка значит “любой символ”, звездочка - “ноль или больше”. Если пользователь введёт “foo.bar”, без escape это сломается. RegExp.escape гарантирует буквальное совпадение. Метод учитывает контекст и использует оптимальные escape-последовательности, чего сложно добиться вручную.
Вот основные спецсимволы, которые экранируются:
- { } | \ /
- Символы вроде \x, \1, \0, \u0000
- Даже некоторые несимвольные: , - = < >
Символ Без escape После RegExp.escape . любой символ . (точка) * 0+ повторений * ( группа ( [ класс [ https:// сломается https:// Проблемы старых подходов и сравнение
Раньше экранирование делали replace с регуляркой, но это работало не везде. Например, String.prototype.replaceAll не покрывает все edge-кейсы вроде Unicode или сложных escape. RegExp.escape создан TC39 и протестирован на реальных сценариях.
Ручные функции часто забывали символы вроде \x или lookbehind. Плюс, они не учитывали флаги RegExp. Новый метод универсален: работает с /v, /u и другими. В ECMAScript 2026 он baseline - доступен везде без полифиллов.
Сравним подходы:
Подход Плюсы Минусы Ручной replace Просто Пропускает edge-кейсы, уязвим Библиотеки (lodash) Готово Зависимость, размер бандла RegExp.escape Нативно, точно, быстро Только ECMAScript 2026+ Важно: не используй escape для паттернов с синтаксисом RegExp - только для литералов.
Примеры использования в реальном коде
Представь функцию удаления неэкранированного текста. Без RegExp.escape пришлось бы вручную экранировать. Теперь код чище и надёжнее.
Пример 1: Удаление некавичного текста.
function removeUnquotedText(str, text) { const regExp = new RegExp(`(?<!")${RegExp.escape(text)}(?!")`, 'gu'); return str.replaceAll(regExp, '•'); } console.log(removeUnquotedText('"yes" и yes и "yes"', 'yes')); // '"yes" и • и "yes"'Это использует lookbehind - работает идеально. Ещё пример: валидация домена.
function removeDomain(text, domain) { return text.replace(new RegExp(`https?:\/\/${RegExp.escape(domain)}(?=\/)`, "g"), ""); }Нюанс: всегда комбинируй с флагами вроде ‘g’ или ‘u’ для Unicode.
- Поиск по пользовательскому вводу:
new RegExp(RegExp.escape(userInput), 'i') - Маскировка URL: экранирует слеши и двоеточия
- Парсинг логов: безопасно ищет строки с точками и скобками
Новые возможности RegExp вместе с escape
RegExp.escape идеально вписывается в фичи ECMAScript 2026 вроде флага /v. Этот флаг добавляет Unicode set escapes и улучшенные группы. Вместе они позволяют строить мощные паттерны динамически.
Например, с /v:
/(?<chars>${RegExp.escape(someStr)})/v. Группы именованные, и escape гарантирует, что someStr не сломает паттерн. Плюс dotAll (/s) и lookbehind работают стабильно.Ключевые комбо:
- RegExp.escape + /v = Unicode-совместимые сеты
- С lookbehind:
(?<!${RegExp.escape(prefix)}) - В replaceAll: полная замена без багов
Фича: Promise.try тоже в 2026, но для async RegExp не меняет.
Когда RegExp.escape меняет правила игры
RegExp.escape упрощает динамические RegExp в формах, API и парсерах. Он устраняет 90% ошибок экранирования, особенно с пользовательским вводом. Осталось подумать о полифиллах для старых браузеров и комбинациях с Float16Array или ArrayBuffer.
Метод не заменяет полную валидацию - используй его targeted. В будущем ждём доработок EscapeRegExpPattern для паттернов. Это шаг к более безопасному JavaScript без внешних deps.
Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.
Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.
С вашими комментариями этот пост мог бы стать ещё лучше 💗
Зарегистрироваться Войти© 2024 - 2026 ExLends, Inc. Все права защищены.