<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[RegExp.escape в ECMAScript 2026: экранирование спецсимволов без костылей]]></title><description><![CDATA[<p dir="auto">В ECMAScript 2026 появился метод <strong>RegExp.escape</strong>. Он экранирует строку, чтобы её можно было безопасно использовать в регулярных выражениях. Это решает проблему ручного экранирования спецсимволов вроде точек, скобок и звездочек.</p>
<p dir="auto">Раньше разработчики писали свои функции или тянули библиотеки, чтобы избежать ошибок. Теперь всё просто: передаёшь строку в RegExp.escape, и получаешь готовый литерал для RegExp. Это упрощает код и снижает риски уязвимостей при работе с пользовательским вводом.</p>
<h2>Что делает RegExp.escape и зачем он нужен</h2>
<p dir="auto">Метод RegExp.escape берёт обычную строку и заменяет все потенциально специальные символы регулярных выражений на их экранированные версии. Например, точка превращается в ., скобки - в ( и ). Это нужно, когда строка из внешнего источника вставляется в RegExp как литерал.</p>
<p dir="auto">Без экранирования спецсимволы интерпретируются как метасимволы: точка значит “любой символ”, звездочка - “ноль или больше”. Если пользователь введёт “foo.bar”, без escape это сломается. RegExp.escape гарантирует буквальное совпадение. Метод учитывает контекст и использует оптимальные escape-последовательности, чего сложно добиться вручную.</p>
<p dir="auto">Вот основные спецсимволы, которые экранируются:</p>
<ul>
<li><strong><div class="plugin-markdown"><input type="checkbox" />{ } | \ /</div></strong></li>
<li>Символы вроде \x, \1, \0, \u0000</li>
<li>Даже некоторые несимвольные: , - = &lt; &gt;</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Символ</th>
<th>Без escape</th>
<th>После RegExp.escape</th>
</tr>
</thead>
<tbody>
<tr>
<td>.</td>
<td>любой символ</td>
<td>. (точка)</td>
</tr>
<tr>
<td>*</td>
<td>0+ повторений</td>
<td>*</td>
</tr>
<tr>
<td>(</td>
<td>группа</td>
<td>(</td>
</tr>
<tr>
<td>[</td>
<td>класс</td>
<td>[</td>
</tr>
<tr>
<td>https://</td>
<td>сломается</td>
<td>https://</td>
</tr>
</tbody>
</table>
<h2>Проблемы старых подходов и сравнение</h2>
<p dir="auto">Раньше экранирование делали replace с регуляркой, но это работало не везде. Например, String.prototype.replaceAll не покрывает все edge-кейсы вроде Unicode или сложных escape. RegExp.escape создан TC39 и протестирован на реальных сценариях.</p>
<p dir="auto">Ручные функции часто забывали символы вроде \x или lookbehind. Плюс, они не учитывали флаги RegExp. Новый метод универсален: работает с /v, /u и другими. В ECMAScript 2026 он baseline - доступен везде без полифиллов.</p>
<p dir="auto">Сравним подходы:</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Подход</th>
<th>Плюсы</th>
<th>Минусы</th>
</tr>
</thead>
<tbody>
<tr>
<td>Ручной replace</td>
<td>Просто</td>
<td>Пропускает edge-кейсы, уязвим</td>
</tr>
<tr>
<td>Библиотеки (lodash)</td>
<td>Готово</td>
<td>Зависимость, размер бандла</td>
</tr>
<tr>
<td><strong>RegExp.escape</strong></td>
<td>Нативно, точно, быстро</td>
<td>Только ECMAScript 2026+</td>
</tr>
</tbody>
</table>
<p dir="auto"><em>Важно</em>: не используй escape для паттернов с синтаксисом RegExp - только для литералов.</p>
<h2>Примеры использования в реальном коде</h2>
<p dir="auto">Представь функцию удаления неэкранированного текста. Без RegExp.escape пришлось бы вручную экранировать. Теперь код чище и надёжнее.</p>
<p dir="auto">Пример 1: Удаление некавичного текста.</p>
<pre><code class="language-javascript">function removeUnquotedText(str, text) {
  const regExp = new RegExp(`(?&lt;!")${RegExp.escape(text)}(?!")`, 'gu');
  return str.replaceAll(regExp, '•');
}
console.log(removeUnquotedText('"yes" и yes и "yes"', 'yes'));
// '"yes" и • и "yes"'
</code></pre>
<p dir="auto">Это использует lookbehind - работает идеально. Ещё пример: валидация домена.</p>
<pre><code class="language-javascript">function removeDomain(text, domain) {
  return text.replace(new RegExp(`https?:\/\/${RegExp.escape(domain)}(?=\/)`, "g"), "");
}
</code></pre>
<p dir="auto"><em>Нюанс</em>: всегда комбинируй с флагами вроде ‘g’ или ‘u’ для Unicode.</p>
<ul>
<li><strong>Поиск по пользовательскому вводу</strong>: <code>new RegExp(RegExp.escape(userInput), 'i')</code></li>
<li><strong>Маскировка URL</strong>: экранирует слеши и двоеточия</li>
<li><strong>Парсинг логов</strong>: безопасно ищет строки с точками и скобками</li>
</ul>
<h2>Новые возможности RegExp вместе с escape</h2>
<p dir="auto">RegExp.escape идеально вписывается в фичи ECMAScript 2026 вроде флага /v. Этот флаг добавляет Unicode set escapes и улучшенные группы. Вместе они позволяют строить мощные паттерны динамически.</p>
<p dir="auto">Например, с /v: <code>/(?&lt;chars&gt;${RegExp.escape(someStr)})/v</code>. Группы именованные, и escape гарантирует, что someStr не сломает паттерн. Плюс dotAll (/s) и lookbehind работают стабильно.</p>
<p dir="auto">Ключевые комбо:</p>
<ul>
<li>RegExp.escape + /v = Unicode-совместимые сеты</li>
<li>С lookbehind: <code>(?&lt;!${RegExp.escape(prefix)})</code></li>
<li>В replaceAll: полная замена без багов</li>
</ul>
<p dir="auto"><em>Фича</em>: Promise.try тоже в 2026, но для async RegExp не меняет.</p>
<h2>Когда RegExp.escape меняет правила игры</h2>
<p dir="auto">RegExp.escape упрощает динамические RegExp в формах, API и парсерах. Он устраняет 90% ошибок экранирования, особенно с пользовательским вводом. Осталось подумать о полифиллах для старых браузеров и комбинациях с Float16Array или ArrayBuffer.</p>
<p dir="auto">Метод не заменяет полную валидацию - используй его targeted. В будущем ждём доработок EscapeRegExpPattern для паттернов. Это шаг к более безопасному JavaScript без внешних deps.</p>
]]></description><link>https://forum.exlends.ru/topic/1250/regexp.escape-v-ecmascript-2026-ekranirovanie-specsimvolov-bez-kostylej</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 03:53:13 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/1250.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 06 Mar 2026 15:24:01 GMT</pubDate><ttl>60</ttl></channel></rss>