Перейти к содержанию
  • Лента
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
Свернуть
exlends
Категории
  1. Главная
  2. Категории
  3. Языки программирования
  4. JavaScript
  5. RegExp.escape в ECMAScript 2026: экранирование спецсимволов без костылей

RegExp.escape в ECMAScript 2026: экранирование спецсимволов без костылей

Запланировано Прикреплена Закрыта Перенесена JavaScript
regexp.escapeecmascript 2026javascript
1 Сообщения 1 Постеры 0 Просмотры
  • Сначала старые
  • Сначала новые
  • По количеству голосов
Ответить
  • Ответить, создав новую тему
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • hannadevH Не в сети
    hannadevH Не в сети
    hannadev
    написал отредактировано
    #1

    В 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.

    1 ответ Последний ответ
    0

    Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.

    Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.

    С вашими комментариями этот пост мог бы стать ещё лучше 💗

    Зарегистрироваться Войти

    Категории

    • Главная
    • Новости
    • Фронтенд
    • Бекенд
    • Языки программирования

    Контакты

    • Сотрудничество
    • info@exlends.com
    • Наш чат
    • Наш ТГ канал

    © 2024 - 2026 ExLends, Inc. Все права защищены.

    Политика конфиденциальности
    • Войти

    • Нет учётной записи? Зарегистрироваться

    • Войдите или зарегистрируйтесь для поиска.
    • Первое сообщение
      Последнее сообщение
    0
    • Лента
    • Категории
    • Последние
    • Метки
    • Популярные
    • Пользователи
    • Группы