<?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[Как вставить переменную в регулярное выражение JavaScript: полное руководство]]></title><description><![CDATA[<p dir="auto">Регулярные выражения в JavaScript - мощный инструмент для поиска и обработки текста. Часто нужно динамически подставлять переменные в паттерны, чтобы делать код гибким. Это решает проблемы с жестко заданными шаблонами, когда данные приходят извне.</p>
<p dir="auto">Без переменных приходится хардкодить каждый regex, что неудобно в реальных проектах. С переменными вы легко ищете email, URL или любые строки по условию пользователя. Давайте разберем, как это работает на практике.</p>
<h2>Два основных способа создания RegExp</h2>
<p dir="auto">В JavaScript регулярные выражения создаются литералами или конструктором RegExp. Литералы подходят для статичных паттернов, они компилируются заранее и быстрее. Но для переменных нужен динамический подход через конструктор.</p>
<p dir="auto"><strong>new RegExp()</strong> принимает строку с паттерном и флаги отдельно. Это позволяет вставлять переменные прямо в шаблон. Например, если у вас есть строка userInput = ‘test’, то RegExp(userInput) создаст поиск по ‘test’. Без конструктора литерал /test/ жестко зафиксирован.</p>
<p dir="auto">Вот почему конструктор обязателен для динамики: переменные экранируются, флаги добавляются отдельно. В реальном коде это спасает от ошибок парсинга.</p>
<ul>
<li><strong>Литерал для статики</strong>: <code>var re = /test/i;</code> - быстро, но без переменных.</li>
<li><strong>Конструктор для динамики</strong>: <code>var re = new RegExp('test', 'i');</code> - вставляем <code>userInput</code> вместо ‘test’.</li>
<li><strong>Экранирование</strong>: используйте <code>userInput.replace(/[.*+?^${}()|[\]\\]/g, '\\$&amp;')</code>, чтобы спецсимволы не сломали regex.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Способ</th>
<th>Пример</th>
<th>Когда использовать</th>
</tr>
</thead>
<tbody>
<tr>
<td>Литерал</td>
<td><code>/test/i</code></td>
<td>Фиксированный паттерн</td>
</tr>
<tr>
<td>Конструктор</td>
<td><code>new RegExp(var, 'i')</code></td>
<td>Динамика с переменной</td>
</tr>
</tbody>
</table>
<h2>Практические примеры вставки переменной</h2>
<p dir="auto">Допустим, пользователь вводит слово для поиска в тексте. Без переменной код негибкий, приходится переписывать. С конструктором RegExp шаблон строится на лету из input.</p>
<p dir="auto">Представьте поиск email по домену из переменной: <code>let domain = 'gmail.com'; let re = new RegExp(domain + '$', 'i');</code>. Это найдет адреса, заканчивающиеся на <a href="http://gmail.com" target="_blank" rel="noopener noreferrer">gmail.com</a>. Работает с <code>str.match(re)</code> или <code>str.replace(re, '***')</code>.</p>
<p dir="auto">Валидация форм - типичный кейс. Переменная patternUser задает маску телефона, RegExp интегрирует ее динамически. Без этого пришлось бы if-else для каждого сценария.</p>
<ul>
<li><strong>Поиск по userInput</strong>:<pre><code class="language-javascript">let input = 'кот';
let re = new RegExp(input, 'gi');
let text = 'Кот в мешке, котлеты.';
console.log(text.match(re)); // ['Кот', 'кот']
</code></pre>
</li>
<li><strong>Валидация с маской</strong>:<pre><code class="language-javascript">let mask = '^\\d{' + length + '}$';
let re = new RegExp(mask);
re.test('12345'); // true, если length=5
</code></pre>
</li>
<li><em>Нюанс</em>: всегда экранируйте! <code>let safe = input.replace(/[.*+?^${}()|[\]\\]/g, '\\$&amp;');</code></li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Задача</th>
<th>Переменная</th>
<th>RegExp</th>
</tr>
</thead>
<tbody>
<tr>
<td>Поиск слова</td>
<td>‘кот’</td>
<td><code>new RegExp('кот', 'gi')</code></td>
</tr>
<tr>
<td>Email домен</td>
<td>‘<a href="http://yandex.ru" target="_blank" rel="noopener noreferrer">yandex.ru</a>’</td>
<td><code>new RegExp(domain + '$')</code></td>
</tr>
<tr>
<td>Телефон</td>
<td>‘^\d{10}$’</td>
<td><code>new RegExp('^\\d{' + 10 + '}$')</code></td>
</tr>
</tbody>
</table>
<h2>Флаги и продвинутые опции с переменными</h2>
<p dir="auto">Флаги вроде g, i, m передаются второй строкой в RegExp. С переменными удобно менять поведение: <code>new RegExp(pattern, flagsVar)</code>. Это позволяет переключать глобальный поиск динамически.</p>
<p dir="auto">Например, переменная isGlobal управляет флагами. Если true - добавляем ‘g’. Без этого литералы негибкие. В проектах с API флаги тоже приходят извне.</p>
<p dir="auto"><strong>Важно</strong>: флаги в строке, не внутри паттерна. Комбинируйте: ‘gi’ для нечувствительного глобального поиска. Тестируйте на edge-кейсах вроде пустой строки.</p>
<ul>
<li><strong>Динамические флаги</strong>:<pre><code class="language-javascript">let flags = isCaseInsensitive ? 'i' : '';
flags += globalSearch ? 'g' : '';
let re = new RegExp(pattern, flags);
</code></pre>
</li>
<li><strong>Многострочный режим</strong>: добавьте ‘m’ для ^ и $ на строках.</li>
<li><em>Проблема</em>: повторное создание RegExp замедляет - кэшируйте по ключу pattern+flags.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Флаг</th>
<th>Описание</th>
<th>Пример с var</th>
</tr>
</thead>
<tbody>
<tr>
<td>i</td>
<td>Игнор регистра</td>
<td><code>new RegExp(pat, 'i')</code></td>
</tr>
<tr>
<td>g</td>
<td>Глобальный</td>
<td><code>new RegExp(pat, 'g')</code></td>
</tr>
<tr>
<td>m</td>
<td>Многострочный</td>
<td><code>new RegExp(pat, 'gm')</code></td>
</tr>
</tbody>
</table>
<h2>Методы работы с динамическим RegExp</h2>
<p dir="auto">После создания используйте match, replace, test. С переменными они идеальны для поиска, замены, валидации. Например, replace с callback’ом меняет найденное по логике.</p>
<p dir="auto"><strong>str.match(re)</strong> возвращает массив ��овпадений. С ‘g’ - все вхождения. Test() - булево для проверок форм. Заменяйте осторожно, экранируя группы.</p>
<p dir="auto">В реальных задачах: очистка логов, парсинг JSON-подобных строк. Переменные делают универсальным инструмент.</p>
<ul>
<li><strong>match</strong>: <code>text.match(re)</code> - массив или null.</li>
<li><strong>replace</strong>: <code>text.replace(re, 'замена')</code> - строка.</li>
<li><strong>test</strong>: <code>re.test(text)</code> - true/false.</li>
<li><em>Совет</em>: для групп используйте <code>matchAll</code> в ES2020+.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Метод</th>
<th>Возврат</th>
<th>С переменной</th>
</tr>
</thead>
<tbody>
<tr>
<td>match</td>
<td>Массив</td>
<td><code>text.match(new RegExp(var))</code></td>
</tr>
<tr>
<td>replace</td>
<td>Строка</td>
<td><code>text.replace(re, fn)</code></td>
</tr>
<tr>
<td>test</td>
<td>Boolean</td>
<td><code>re.test(input)</code></td>
</tr>
</tbody>
</table>
<h2>Частые ошибки и как их обходить</h2>
<p dir="auto">Часто спецсимволы в переменной ломают RegExp - экранируйте заранее. Пустая строка создает /^$/, матчит все. Флаги дублируйте внимательно.</p>
<p dir="auto">Повторное создание RegExp без кэша жрет производительность в циклах. Храните в Map: ключ - pattern+flags.</p>
<p dir="auto">Безопасность: userInput не экранировать - XSS в replace. Всегда валидируйте вход.</p>
<ul>
<li><strong>Экранирование</strong>: <code>var safePat = input.replace(/[.*+?^${}()|[\]\\]/g, '\\$&amp;');</code></li>
<li><strong>Кэш</strong>: <code>const cache = new Map(); re = cache.get(key) || (cache.set(key, new RegExp(pat, flags)), cache.get(key));</code></li>
<li><em>Нюанс</em>: RegExp.lastIndex с ‘g’ сбрасывайте вручную.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Ошибка</th>
<th>Решение</th>
<th>Пример</th>
</tr>
</thead>
<tbody>
<tr>
<td>Спецсимволы</td>
<td>Экранировать</td>
<td><code>replace(//g, '\\$&amp;')</code></td>
</tr>
<tr>
<td>Медленный цикл</td>
<td>Кэшировать</td>
<td>Map по паттерну</td>
</tr>
<tr>
<td>Пустой паттерн</td>
<td>Проверка if</td>
<td><code>if (!pat) return null;</code></td>
</tr>
</tbody>
</table>
<h2>Тонкости динамических шаблонов на практике</h2>
<p dir="auto">С переменными RegExp открывает двери для конфигов из JSON или API. Остается углубиться в группы захвата, lookahead и производительность на больших текстах. Подумайте о polyfill для старых браузеров и интеграции с фреймворками вроде React, где state управляет паттернами.</p>
]]></description><link>https://forum.exlends.ru/topic/843/kak-vstavit-peremennuyu-v-regulyarnoe-vyrazhenie-javascript-polnoe-rukovodstvo</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 02:56:01 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/843.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 28 Feb 2026 09:44:47 GMT</pubDate><ttl>60</ttl></channel></rss>