<?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[<h1></h1>
<h2>Зачем нужны регулярные выражения?</h2>
<p dir="auto">Регулярные выражения (regex) — это мощный инструмент для поиска, проверки и преобразования текста по определённым шаблонам. Без них разработчику пришлось бы писать громоздкий код с множеством условий.</p>
<p dir="auto"><strong>Примеры использования:</strong></p>
<ul>
<li>Валидация email, номеров телефонов, URL</li>
<li>Поиск и замена текста по шаблону</li>
<li>Парсинг и извлечение данных из строк</li>
<li>Обработка лог-файлов</li>
<li>Форматирование данных</li>
</ul>
<p dir="auto"><strong>Быстрый пример:</strong></p>
<pre><code class="language-javascript">// Без regex — много условий и цикловых конструкций
// Валидация email вручную — сложно и ненадёжно

// С regex — одна строка
const isValidEmail = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
</code></pre>
<hr />
<h2>Основы: Как создать регулярное выражение</h2>
<h3>Два способа создания</h3>
<p dir="auto"><strong>1. Литеральная нотация (предпочтительно для статичных паттернов)</strong></p>
<pre><code class="language-javascript">const pattern = /hello/;
</code></pre>
<p dir="auto"><strong>2. Конструктор RegExp (для динамических паттернов)</strong></p>
<pre><code class="language-javascript">const pattern = new RegExp('hello');
const userPattern = new RegExp(`${userInput}`, 'gi');
</code></pre>
<p dir="auto">Используйте литеральную нотацию, когда паттерн известен заранее — она быстрее. Конструктор нужен, когда паттерн строится динамически из переменных.</p>
<hr />
<h2>Флаги: Управление поведением</h2>
<p dir="auto">Флаги добавляются после паттерна и изменяют способ поиска:</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Флаг</th>
<th>Описание</th>
<th>Пример</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>g</code></td>
<td><strong>Global</strong> — найти все совпадения, не только первое</td>
<td><code>/cat/g</code> находит все “cat” в строке</td>
</tr>
<tr>
<td><code>i</code></td>
<td><strong>Ignore case</strong> — игнорировать регистр</td>
<td><code>/hello/i</code> найдёт “Hello”, “HELLO”, “hello”</td>
</tr>
<tr>
<td><code>m</code></td>
<td><strong>Multiline</strong> — <code>^</code> и <code>$</code> работают для каждой строки</td>
<td><code>/^start/m</code> найдёт “start” в начале каждой строки</td>
</tr>
<tr>
<td><code>s</code></td>
<td><strong>Dotall</strong> — точка <code>.</code> будет совпадать с переносом строки</td>
<td><code>/a.b/s</code> найдёт “a\nb”</td>
</tr>
<tr>
<td><code>u</code></td>
<td><strong>Unicode</strong> — правильная работа с Unicode символами</td>
<td><code>/\p{L}/u</code> найдёт любую букву</td>
</tr>
<tr>
<td><code>d</code></td>
<td><strong>Indices</strong> — получить позиции совпадений</td>
<td>использует свойство <code>indices</code></td>
</tr>
</tbody>
</table>
<p dir="auto"><strong>Комбинирование флагов:</strong></p>
<pre><code class="language-javascript">const pattern = /hello/gi; // Глобальный поиск, игнорируя регистр
const str = 'Hello there, HELLO world';
console.log(str.match(pattern)); // ['Hello', 'HELLO']
</code></pre>
<hr />
<h2>Символы и классы: Что искать</h2>
<h3>Простые символы</h3>
<pre><code class="language-javascript">/abc/.test('abc');        // true — ищем точную последовательность
/abc/.test('abcd');       // true — "abc" есть в строке
/abc/.test('ab c');       // false — нет точной последовательности
</code></pre>
<h3>Специальные символы (метасимволы)</h3>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Символ</th>
<th>Значение</th>
<th>Пример</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>.</code></td>
<td>Любой символ (кроме переноса строки)</td>
<td><code>/a.c/</code> совпадает с “abc”, “adc”, но не “a\nc”</td>
</tr>
<tr>
<td><code>^</code></td>
<td>Начало строки</td>
<td><code>/^hello/</code> только если строка начинается с “hello”</td>
</tr>
<tr>
<td><code>$</code></td>
<td>Конец строки</td>
<td><code>/world$/</code> только если строка заканчивается на “world”</td>
</tr>
<tr>
<td><code>\</code></td>
<td>Экранирование специального символа</td>
<td><code>/a\.b/</code> ищет букв “a”, точку и “b” буквально</td>
</tr>
</tbody>
</table>
<p dir="auto"><strong>Примеры:</strong></p>
<pre><code class="language-javascript">// Начало и конец строки
/^hello/.test('hello world');        // true
/^hello/.test('say hello');          // false
/world$/.test('hello world');        // true

// Точка — любой символ
/a.c/.test('abc');                   // true
/a.c/.test('adc');                   // true
/a.c/.test('a\nc');                  // false (нужен флаг 's')
</code></pre>
<h3>Классы символов: `` — выбор из набора</h3>
<p dir="auto">Квадратные скобки означают “любой один символ из списка”:</p>
<pre><code class="language-javascript">// Одиночные символы
/[aeiou]/.test('hello');             // true (буква 'e')
/[0-9]/.test('abc123');              // true (цифра '1')

// Диапазоны
/[a-z]/.test('hello');               // true (любая строчная буква)
/[A-Z]/.test('Hello');               // true (прописная буква)
/[0-9]/.test('test2');               // true (цифра)

// Инверсия (всё кроме указанного)
/[^aeiou]/.test('hello');            // true (согласная буква)
</code></pre>
<h3>Встроенные классы: Сокращения для популярных наборов</h3>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Класс</th>
<th>Эквивалент</th>
<th>Описание</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>\d</code></td>
<td><code>[0-9]</code></td>
<td>Цифра</td>
</tr>
<tr>
<td><code>\D</code></td>
<td><code>[^0-9]</code></td>
<td>Не цифра</td>
</tr>
<tr>
<td><code>\w</code></td>
<td><code>[A-Za-z0-9_]</code></td>
<td>Буква, цифра или подчёркивание (word character)</td>
</tr>
<tr>
<td><code>\W</code></td>
<td><code>[^A-Za-z0-9_]</code></td>
<td>Не буква/цифра</td>
</tr>
<tr>
<td><code>\s</code></td>
<td><code>[ \t\n\r\f]</code></td>
<td>Пробел или табуляция</td>
</tr>
<tr>
<td><code>\S</code></td>
<td><code>[^ \t\n\r\f]</code></td>
<td>Не пробел</td>
</tr>
<tr>
<td><code>\b</code></td>
<td>—</td>
<td>Граница слова (между буквой и не-буквой)</td>
</tr>
<tr>
<td><code>\B</code></td>
<td>—</td>
<td>Не граница слова</td>
</tr>
</tbody>
</table>
<p dir="auto"><strong>Практические примеры:</strong></p>
<pre><code class="language-javascript">// Найти все цифры в строке
'abc123def456'.match(/\d/g);         // ['1', '2', '3', '4', '5', '6']

// Найти все слова
'hello world 123'.match(/\w+/g);     // ['hello', 'world', '123']

// Пробелы
'hello   world'.split(/\s+/);        // ['hello', 'world']

// Только в начале слова
'par spar apart'.replace(/\bpar/g, 'X'); // 'X spar aX' — заменяет только целые слова
</code></pre>
<hr />
<h2>Квантификаторы: Количество повторений</h2>
<p dir="auto">Квантификаторы указывают, сколько раз должен повториться предыдущий символ или группа:</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Квантификатор</th>
<th>Значение</th>
<th>Пример</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>?</code></td>
<td>0 или 1 раз (опционально)</td>
<td><code>/colou?r/</code> совпадает с “color” и “colour”</td>
</tr>
<tr>
<td><code>*</code></td>
<td>0 или больше раз</td>
<td><code>/ab*c/</code> совпадает с “ac”, “abc”, “abbc”</td>
</tr>
<tr>
<td><code>+</code></td>
<td>1 или больше раз</td>
<td><code>/ab+c/</code> совпадает с “abc”, “abbc”, но не “ac”</td>
</tr>
<tr>
<td><code>{n}</code></td>
<td>Точно n раз</td>
<td><code>/a{3}/</code> совпадает только с “aaa”</td>
</tr>
<tr>
<td><code>{n,}</code></td>
<td>n или больше раз</td>
<td><code>/a{2,}/</code> совпадает с “aa”, “aaa”, “aaaa”</td>
</tr>
<tr>
<td><code>{n,m}</code></td>
<td>От n до m раз</td>
<td><code>/a{2,4}/</code> совпадает с “aa”, “aaa” или “aaaa”</td>
</tr>
</tbody>
</table>
<p dir="auto"><strong>Примеры:</strong></p>
<pre><code class="language-javascript">// Опциональные символы
const phonePattern = /\d{3}-?\d{3}-?\d{4}/;
phonePattern.test('123-456-7890');   // true
phonePattern.test('1234567890');     // true

// Пароль: минимум 8 символов
/^.{8,}$/.test('mypass123');         // true

// Телефон США
/^\(?[0-9]{3}\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}$/.test('(123) 456-7890'); // true

// Одна или больше цифр
'123abc456'.match(/\d+/g);           // ['123', '456']
</code></pre>
<hr />
<h2>Группы и захват: Выделение части совпадения</h2>
<h3>Группы для логики</h3>
<pre><code class="language-javascript">// Группа группирует для квантификаторов
/(ab)+/.test('ababab');              // true
/(ab)+/.test('abac');                // false

// Или внутри группы
/(cat|dog)/.test('I have a cat');    // true
/col(ou)?r/.test('color');           // true
/col(ou)?r/.test('colour');          // true
</code></pre>
<h3>Захватывающие группы: Извлечение данных</h3>
<p dir="auto">Скобки <code>()</code> создают “захватывающую группу” — часть совпадения, которую потом можно использовать:</p>
<pre><code class="language-javascript">// Извлечение частей совпадения
const email = 'john@example.com';
const match = email.match(/([a-z]+)@([a-z.]+)/);

console.log(match[0]);  // 'john@example.com' (полное совпадение)
console.log(match[1]);  // 'john' (первая группа)
console.log(match[2]);  // 'example.com' (вторая группа)

// В replace — используем группы через $1, $2 и т.д.
'John Smith'.replace(/(\w+) (\w+)/, '$2, $1'); // 'Smith, John'

// Дата: преобразование из YYYY-MM-DD в DD.MM.YYYY
'2025-01-15'.replace(/(\d{4})-(\d{2})-(\d{2})/, '$3.$2.$1'); // '15.01.2025'
</code></pre>
<h3>Неzахватывающие группы: <code>(?:...)</code></h3>
<p dir="auto">Когда нужна группа для логики, но не нужно сохранять совпадение:</p>
<pre><code class="language-javascript">// С захватом (создаёт группу 1)
/(cat|dog) \1/.test('cat cat');      // true (говорит: повторить то же слово)

// Без захвата — просто группировка
const color = /(red|green|blue)/;
const result = 'I like green'.match(color);
console.log(result[1]); // 'green'

// Когда захват не нужен
/(?:https?|ftp):\/\//.test('https://example.com'); // true
'files.txt, images.png'.match(/\.(?:txt|png|jpg)/g); // ['.txt', '.png']
</code></pre>
<h3>Именованные группы: Читаемость кода</h3>
<pre><code class="language-javascript">const datePattern = /(?&lt;year&gt;\d{4})-(?&lt;month&gt;\d{2})-(?&lt;day&gt;\d{2})/;
const date = '2025-01-15';
const match = date.match(datePattern);

console.log(match.groups.year);  // '2025'
console.log(match.groups.month); // '01'
console.log(match.groups.day);   // '15'

// В replace используем $&lt;name&gt;
'2025-01-15'.replace(datePattern, '$&lt;day&gt;.$&lt;month&gt;.$&lt;year&gt;'); // '15.01.2025'
</code></pre>
<hr />
<h2>Backreference: Ссылка на уже найденное</h2>
<p dir="auto">Backreference <code>\1</code>, <code>\2</code> и т.д. означают “повтори то же, что нашли в группе 1, 2 и т.д.”:</p>
<pre><code class="language-javascript">// Найти повторяющиеся слова
/\b(\w+) \1\b/.test('the the');      // true
/\b(\w+) \1\b/.test('the cat');      // false

// Убрать повторяющиеся слова
'hello hello world world test'.replace(/\b(\w+) \1+\b/g, '$1');
// 'hello world test'

// Фигурные скобки: найти две одинаковые цифры подряд
/(\d)\1/.test('11');                 // true
/(\d)\1/.test('12');                 // false

// Скобки вокруг одного и того же
/([([]))\1/.test('(())');            // true
</code></pre>
<hr />
<h2>Lookahead и Lookbehind: Условные совпадения</h2>
<p dir="auto">Lookahead и lookbehind — это “нулевой ширины” проверки. Они проверяют, есть ли что-то дальше или раньше, но не включают это в совпадение.</p>
<h3>Positive lookahead <code>(?=...)</code></h3>
<p dir="auto">“Совпадает, если дальше идёт…”</p>
<pre><code class="language-javascript">// Найти цифры, которые идут перед словом "miles"
'5 miles, 10 kilometers'.match(/\d+(?= miles)/g); // ['5']

// Пароль содержит минимум одну цифру
/(?=.*\d)/.test('password123');      // true (дальше идут цифры)
/(?=.*\d)/.test('password');         // false

// Числа перед запятой или концом
'5, 10, 15'.match(/\d+(?=[,]|$)/g); // ['5', '10', '15']
</code></pre>
<h3>Negative lookahead <code>(?!...)</code></h3>
<p dir="auto">“Совпадает, если дальше НЕ идёт…”</p>
<pre><code class="language-javascript">// Найти "cat", которые НЕ следуют перед цифрой
'cat, cat1, cat2'.match(/cat(?!\d)/g); // ['cat']

// Слова, не являющиеся числами
'hello 123 world'.match(/\w+(?!\d)/g); // ['hello', 'world']

// URL без https
'http://example.com, https://secure.com'.match(/https?:\/\/(?!https)/g);
</code></pre>
<h3>Positive lookbehind <code>(?&lt;=...)</code></h3>
<p dir="auto">“Совпадает, если перед этим идёт…”</p>
<pre><code class="language-javascript">// Цифры, которые идут после доллара
'$5, €10, $20'.match(/(?&lt;=\$)\d+/g); // ['5', '20']

// Слово, которому предшествует точка
'Dr. Smith'.match(/(?&lt;=\.)[\w\s]+/);  // [' Smith']
</code></pre>
<h3>Negative lookbehind <code>(?&lt;!...)</code></h3>
<p dir="auto">“Совпадает, если перед этим НЕ идёт…”</p>
<pre><code class="language-javascript">// Слова, которым НЕ предшествует двоеточие
'name: John, age: 25, city: Moscow'.match(/(?&lt;!:)\s(\w+)/g);

// Цены без валюты
'$10 free! €20 paid'.match(/(?&lt;!\$)\d+/g); // ['20'] в контексте
</code></pre>
<p dir="auto"><strong>Практический пример с lookaround:</strong></p>
<pre><code class="language-javascript">// Валидация пароля: минимум 8 символов, буква и цифра
const passwordRegex = /^(?=.*[a-zA-Z])(?=.*\d).{8,}$/;
passwordRegex.test('password1');     // true
passwordRegex.test('password');      // false (нет цифры)
passwordRegex.test('pass1');         // false (меньше 8)
</code></pre>
<hr />
<h2>Методы работы с regex в JavaScript</h2>
<h3><code>test()</code> — Проверка на совпадение</h3>
<p dir="auto">Возвращает <code>true</code> или <code>false</code>:</p>
<pre><code class="language-javascript">const pattern = /hello/;
pattern.test('hello world');         // true
pattern.test('goodbye world');       // false
</code></pre>
<h3><code>match()</code> — Найти все совпадения</h3>
<p dir="auto">Возвращает массив совпадений или <code>null</code>:</p>
<pre><code class="language-javascript">// Без флага 'g' — только первое совпадение с деталями
'hello hello hello'.match(/hello/);
// ['hello', index: 0, groups: undefined, input: 'hello hello hello']

// С флагом 'g' — все совпадения, но без деталей
'hello hello hello'.match(/hello/g);
// ['hello', 'hello', 'hello']

// С группами
'john@example.com jane@test.com'.match(/(\w+)@(\w+)/g);
// ['john@example.com', 'jane@test.com']
</code></pre>
<h3><code>matchAll()</code> — Итератор по всем совпадениям</h3>
<pre><code class="language-javascript">const str = 'test1 test2 test3';
const pattern = /test(\d)/g;
const matches = Array.from(str.matchAll(pattern));

matches.forEach(match =&gt; {
  console.log(match[0]);  // полное совпадение
  console.log(match[1]);  // первая группа
  console.log(match.index); // позиция
});
</code></pre>
<h3><code>search()</code> — Позиция первого совпадения</h3>
<p dir="auto">Возвращает индекс или -1:</p>
<pre><code class="language-javascript">'hello world'.search(/world/);       // 6
'hello world'.search(/xyz/);         // -1
</code></pre>
<h3><code>replace()</code> — Заменить первое совпадение</h3>
<pre><code class="language-javascript">'hello hello'.replace(/hello/, 'hi');        // 'hi hello'
'hello hello'.replace(/hello/g, 'hi');      // 'hi hi'

// С функцией-обработчиком
'5 and 10'.replace(/\d+/g, (match) =&gt; {
  return parseInt(match) * 2;
});
// '10 and 20'
</code></pre>
<h3><code>replaceAll()</code> — Заменить все совпадения</h3>
<pre><code class="language-javascript">'hello hello'.replaceAll('hello', 'hi');    // 'hi hi'
// Эквивалент: replace(/hello/g, 'hi')
</code></pre>
<h3><code>split()</code> — Разбить строку по паттерну</h3>
<pre><code class="language-javascript">// Разделитель
'a,b;c:d'.split(/[,;:]/);           // ['a', 'b', 'c', 'd']

// С захватывающими группами — включить разделители
'a1b2c3'.split(/(\d)/);             // ['a', '1', 'b', '2', 'c', '3']

// Множественные пробелы
'hello    world  test'.split(/\s+/); // ['hello', 'world', 'test']
</code></pre>
<h3><code>exec()</code> — Детальный поиск</h3>
<p dir="auto">Возвращает подробный результат или null:</p>
<pre><code class="language-javascript">const pattern = /(\d{3})-(\d{3})-(\d{4})/;
const match = pattern.exec('My phone: 555-123-4567');

match[0];    // '555-123-4567' (полное совпадение)
match[1];    // '555' (первая группа)
match[2];    // '123'
match[3];    // '4567'
match.index; // 10 (где начинается совпадение)
</code></pre>
<hr />
<h2>Практические примеры из реальной жизни</h2>
<h3>Валидация email</h3>
<pre><code class="language-javascript">const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
emailPattern.test('user@example.com');      // true
emailPattern.test('invalid.email@');        // false
</code></pre>
<h3>Валидация телефона</h3>
<pre><code class="language-javascript">// Формат: (XXX) XXX-XXXX или XXX-XXX-XXXX
const phonePattern = /^(\+1)?[-.\s]?\(?[0-9]{3}\)?[-.\s]?[0-9]{3}[-.\s]?[0-9]{4}$/;
phonePattern.test('(555) 123-4567');       // true
phonePattern.test('555-123-4567');         // true
phonePattern.test('+1-555-123-4567');      // true
</code></pre>
<h3>Извлечение всех URL из текста</h3>
<pre><code class="language-javascript">const text = 'Visit https://example.com and http://test.org';
const urls = text.match(/https?:\/\/[^\s]+/g);
// ['https://example.com', 'http://test.org']
</code></pre>
<h3>Парсинг даты и преобразование формата</h3>
<pre><code class="language-javascript">// ISO (YYYY-MM-DD) в локальный (DD.MM.YYYY)
'2025-01-15 2025-12-25'.replace(/(\d{4})-(\d{2})-(\d{2})/g, '$3.$2.$1');
// '15.01.2025 25.12.2025'
</code></pre>
<h3>Удаление HTML тегов</h3>
<pre><code class="language-javascript">const html = '&lt;p&gt;Hello &lt;b&gt;world&lt;/b&gt;!&lt;/p&gt;';
html.replace(/&lt;[^&gt;]*&gt;/g, '');               // 'Hello world!'
</code></pre>
<h3>Каждое слово с заглавной буквы (Title Case)</h3>
<pre><code class="language-javascript">function titleCase(str) {
  return str.replace(/\b\w/g, (match) =&gt; match.toUpperCase());
}
titleCase('hello world javascript'); // 'Hello World Javascript'
</code></pre>
<h3>Форматирование цены (добавление разделителей)</h3>
<pre><code class="language-javascript">const price = '1000000';
price.replace(/\B(?=(\d{3})+(?!\d))/g, ' '); // '1 000 000'
// Или: price.replace(/(\d)(?=(\d{3})+$)/g, '$1 '); // '1 000 000'
</code></pre>
<h3>Валидация пароля (сложный пример)</h3>
<pre><code class="language-javascript">// Минимум 8 символов, минимум одна буква, одна цифра, один спецсимвол
const passwordPattern = /^(?=.*[a-zA-Z])(?=.*\d)(?=.*[@$!%*?&amp;])[A-Za-z\d@$!%*?&amp;]{8,}$/;

passwordPattern.test('Pass123!');           // true
passwordPattern.test('password');           // false (нет цифры и спецсимвола)
passwordPattern.test('Pass1');              // false (меньше 8 символов)
</code></pre>
<h3>Замена значений в объекте</h3>
<pre><code class="language-javascript">const config = 'name=john&amp;age=25&amp;city=moscow';
config.replace(/([^=&amp;]+)=([^&amp;]*)/g, (match, key, value) =&gt; {
  console.log(`${key}: ${value}`);
  return match;
});
// name: john
// age: 25
// city: moscow
</code></pre>
<hr />
<h2>Частые ошибки и как их избежать</h2>
<h3>1. Забыли флаг <code>g</code> — заменилось только первое совпадение</h3>
<pre><code class="language-javascript">// ❌ Неправильно
'hello hello'.replace(/hello/, 'hi');       // 'hi hello'

// ✅ Правильно
'hello hello'.replace(/hello/g, 'hi');      // 'hi hi'
</code></pre>
<h3>2. Не экранировали спецсимволы</h3>
<pre><code class="language-javascript">// ❌ Неправильно — точка совпадает с любым символом
/a.b/.test('a b');                  // true (нежелательно)

// ✅ Правильно
/a\.b/.test('a.b');                 // true
/a\.b/.test('a b');                 // false
</code></pre>
<h3>3. Забыли <code>^</code> и <code>$</code> — совпадение может быть частью строки</h3>
<pre><code class="language-javascript">// ❌ Неправильно
/^[0-9]+$/.test('abc123def');       // false (но хотели false)
/[0-9]+/.test('abc123def');         // true (число есть, но не только число)

// ✅ Правильно
/^\d+$/.test('123');                // true (только цифры)
/^\d+$/.test('123abc');             // false (есть буквы)
</code></pre>
<h3>4. Жадные квантификаторы вместо ленивых</h3>
<pre><code class="language-javascript">// ❌ Жадное — захватывает слишком много
'&lt;p&gt;Hello&lt;/p&gt; &lt;b&gt;Bold&lt;/b&gt;'.match(/&lt;.*&gt;/g);
// ['&lt;p&gt;Hello&lt;/p&gt; &lt;b&gt;Bold&lt;/b&gt;'] — одно совпадение вместо двух

// ✅ Ленивое — `?` после квантификатора
'&lt;p&gt;Hello&lt;/p&gt; &lt;b&gt;Bold&lt;/b&gt;'.match(/&lt;.*?&gt;/g);
// ['&lt;p&gt;', '&lt;/p&gt;', '&lt;b&gt;', '&lt;/b&gt;'] — правильно
</code></pre>
<h3>5. Забыли экранировать обратный слэш в конструкторе</h3>
<pre><code class="language-javascript">// ❌ Неправильно
new RegExp('\d+');                  // Интерпретируется неправильно

// ✅ Правильно
new RegExp('\\d+');                 // Экранируем слэш в строке
// Или просто используйте литеральную нотацию:
/\d+/;
</code></pre>
<hr />
<h2>Шпаргалка: Визуальный справочник</h2>
<h3>Краткая таблица символов</h3>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Что нужно</th>
<th>Регулярное выражение</th>
<th>Пример</th>
</tr>
</thead>
<tbody>
<tr>
<td>Любой символ</td>
<td><code>.</code></td>
<td><code>a.c</code> совпадает “abc”, “adc”</td>
</tr>
<tr>
<td>Буква</td>
<td><code>[a-zA-Z]</code> или <code>\p{L}</code> (с флагом u)</td>
<td><code>[a-z]</code> совпадает “a” до “z”</td>
</tr>
<tr>
<td>Цифра</td>
<td><code>\d</code></td>
<td><code>\d{3}</code> совпадает “123”</td>
</tr>
<tr>
<td>Не цифра</td>
<td><code>\D</code></td>
<td><code>\D+</code> совпадает “abc”</td>
</tr>
<tr>
<td>Пробел</td>
<td><code>\s</code></td>
<td><code>\s+</code> совпадает "   "</td>
</tr>
<tr>
<td>Не пробел</td>
<td><code>\S</code></td>
<td><code>\S+</code> совпадает “word”</td>
</tr>
<tr>
<td>Слово</td>
<td><code>\w</code></td>
<td><code>\w+</code> совпадает “hello_123”</td>
</tr>
<tr>
<td>Граница слова</td>
<td><code>\b</code></td>
<td><code>\bhello\b</code> только целое слово</td>
</tr>
<tr>
<td>Начало</td>
<td><code>^</code></td>
<td><code>^hello</code> только в начале</td>
</tr>
<tr>
<td>Конец</td>
<td><code>$</code></td>
<td><code>world$</code> только в конце</td>
</tr>
</tbody>
</table>
<h3>Квантификаторы (сколько повторений)</h3>
<pre><code>a?      — ноль или один раз
a*      — ноль или больше
a+      — один или больше
a{3}    — ровно 3 раза
a{2,5}  — от 2 до 5 раз
a{2,}   — минимум 2 раза
a??     — ноль или один (ленивый)
a*?     — ноль или больше (ленивый)
a+?     — один или больше (ленивый)
</code></pre>
<h3>Методы String</h3>
<pre><code>str.test(regex)         → true/false
str.match(regex)        → [совпадения]
str.search(regex)       → индекс или -1
str.replace(regex, new) → новая строка
str.split(regex)        → массив
str.matchAll(regex)     → итератор
</code></pre>
<hr />
<h2>Интерактивные инструменты и отладка</h2>
<p dir="auto">При разработке сложных regex используйте онлайн-инструменты:</p>
<ul>
<li><strong><a href="http://regex101.com" target="_blank" rel="noopener noreferrer">regex101.com</a></strong> — визуализация совпадений с объяснениями</li>
<li><strong><a href="http://regexper.com" target="_blank" rel="noopener noreferrer">regexper.com</a></strong> — диаграмма паттерна</li>
<li><strong><a href="http://regexpal.com" target="_blank" rel="noopener noreferrer">regexpal.com</a></strong> — простой тестер</li>
</ul>
<p dir="auto">Совет: Стройте regex пошагово. Сначала простой паттерн, потом добавляйте сложность и тестируйте после каждого шага.</p>
<hr />
<h2>Заключение</h2>
<p dir="auto">Регулярные выражения — это мощный инструмент, который экономит время и код. Начните с простых паттернов и постепенно усложняйте. Благодаря lookahead, lookaround и группам, можно решать сложные задачи парсинга и валидации в одной строке.</p>
<p dir="auto"><strong>Помните:</strong> лучший regex — это тот, который легко читать. Используйте именованные группы, комментарии в коде и тестируйте на реальных данных.</p>
]]></description><link>https://forum.exlends.ru/topic/379/regulyarnye-vyrazheniya-v-javascript-polnyj-gajd-i-shpargalka</link><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 03:06:16 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/379.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 29 Dec 2025 11:19:35 GMT</pubDate><ttl>60</ttl></channel></rss>