Введение в регулярные выражения JavaScript
Регулярные выражения (regex или regexp) — это мощный инструмент для поиска, замены и проверки строк по заданному шаблону. В JavaScript (и Node.js) они реализованы через встроенный объект RegExp.
Для новичка синтаксис regex может показаться пугающим, но на самом деле это просто язык описания шаблонов. Освоив базовые конструкции, вы сможете:
- Валидировать email, телефон, URL
- Извлекать данные из текста (парсинг)
- Заменять подстроки по сложным правилам
- Фильтровать и обрабатывать пользовательский ввод
В этой статье мы разберем регулярные выражения в JavaScript с примерами на Node.js. Все примеры можно запустить в консоли или в среде выполнения.
Создание регулярного выражения в JS
В JavaScript есть два способа создать regex:
1. Литеральный синтаксис (рекомендуется)
const pattern = /hello/; // Ищет слово "hello"
Шаблон заключается между двумя слэшами. После закрывающего слэша можно указать флаги (например, i — регистронезависимый поиск).
2. Конструктор RegExp
const pattern = new RegExp('hello'); // Аналог /hello/
Используется, когда шаблон динамический (формируется из переменной).
Флаги регулярных выражений
i— игнорировать регистр (/hello/iнайдет "Hello", "HELLO")g— глобальный поиск (ищет все совпадения, а не первое)m— многострочный режим (смена поведения якорей^и$)s— точка соответствует символу перевода строкиu— поддержка Unicodey— липкий поиск (ищет только с позиции lastIndex)
const regex = /javascript/gi; // Ищет "javascript" глобально и без учета регистра
Основные методы работы с regex в JavaScript
Рассмотрим ключевые методы, которые используются с регулярными выражениями.
test() — проверка наличия шаблона
Возвращает true или false. Самый быстрый метод для валидации.
const emailPattern = /^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$/i;
console.log(emailPattern.test('user@example.com')); // true
console.log(emailPattern.test('invalid-email')); // false
exec() — поиск с деталями
Возвращает массив с совпадением и группами. При флаге g запоминает позицию.
const str = 'Цена: 100 руб, скидка: 20 руб';
const pricePattern = /(\d+)\sруб/g;
let match;
while ((match = pricePattern.exec(str)) !== null) {
console.log(`Найдено: ${match[0]}, число: ${match[1]}`);
}
// Вывод:
// Найдено: 100 руб, число: 100
// Найдено: 20 руб, число: 20
match() — поиск в строке
Метод строки. Без флага g возвращает первое совпадение (как exec). С флагом g — массив всех совпадений.
const text = 'JS — это JavaScript, не путайте с Java.';
const jsMatches = text.match(/Java\w*/g);
console.log(jsMatches); // ['JavaScript', 'Java']
replace() — замена по шаблону
Заменяет совпадения на новую строку. Поддерживает специальные символы ($1, $&).
const phone = '+7 (123) 456-78-90';
const cleanPhone = phone.replace(/[\s\(\)\-]/g, '');
console.log(cleanPhone); // +71234567890
// Замена с использованием групп
const date = '2024-03-15';
const reversed = date.replace(/(\d{4})-(\d{2})-(\d{2})/, '$3.$2.$1');
console.log(reversed); // 15.03.2024
search() — индекс первого совпадения
const index = 'Hello world'.search(/world/);
console.log(index); // 6
Базовые символы и конструкции regex
Чтобы писать свои шаблоны, нужно знать основные метасимволы.
Якоря и границы
^— начало строки (или строки с флагомm)$— конец строки\b— граница слова\B— не граница слова
console.log(/^Hello/.test('Hello world')); // true
console.log(/world$/.test('Hello world')); // true
console.log(/\bcat\b/.test('The cat sat')); // true (целое слово)
console.log(/\bcat\b/.test('category')); // false
Классы символов
\d— любая цифра (0-9)\w— буква, цифра или подчеркивание\s— пробельный символ (пробел, табуляция, перевод строки).— любой символ, кроме перевода строки[...]— набор символов (например,[aeiou]— гласные)[^...]— отрицание набора
// Найти все цифры в строке
console.log('Год 2024, месяц 03'.match(/\d+/g)); // ['2024', '03']
// Найти слова из 3 букв
console.log('The cat and dog'.match(/\b\w{3}\b/g)); // ['The', 'cat', 'and', 'dog']
Квантификаторы (повторения)
*— 0 или более раз+