Регулярные выражения в JavaScript с примерами для Node.js
Регулярные выражения (regex или regexp) — мощный инструмент для поиска, замены и извлечения текстовой информации. В JavaScript и Node.js они используются повсеместно: от валидации форм до парсинга логов и обработки запросов. Эта статья поможет вам освоить синтаксис регулярных выражений на практических примерах, которые можно сразу запустить в Node.js.
1. Создание регулярных выражений в JavaScript
В JavaScript существует два способа создать регулярное выражение:
- Литеральный синтаксис — шаблон заключается в слеши
/pattern/flags. Рекомендуется для статических шаблонов. - Конструктор RegExp —
new RegExp('pattern', 'flags'). Используется, если шаблон формируется динамически.
// Литеральный способ
const regexLiteral = /hello/i;
// Конструктор RegExp
const pattern = 'hello';
const regexConstructor = new RegExp(pattern, 'i');
console.log(regexLiteral.test('Hello World')); // true
console.log(regexConstructor.test('Hello World')); // true
2. Основные методы работы с регулярными выражениями
В Node.js и браузерах доступны четыре ключевых метода для работы с regex. Разберём каждый на примерах.
Метод test()
Проверяет, содержит ли строка совпадение с шаблоном. Возвращает true или false.
const emailPattern = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
console.log(emailPattern.test('user@example.com')); // true
console.log(emailPattern.test('invalid-email')); // false
Метод exec()
Ищет совпадение и возвращает массив с деталями (само совпадение, группы, индекс, входная строка). Если совпадений нет — null.
const text = 'Цена: 1500 рублей, скидка: 300 рублей';
const regex = /(\d+)\sрублей/g;
let match;
while ((match = regex.exec(text)) !== null) {
console.log(`Найдено: ${match[1]} рублей`);
// Вывод: "Найдено: 1500 рублей"
// Вывод: "Найдено: 300 рублей"
}
Метод match()
Вызывается на строке. Возвращает массив совпадений (с флагом g) или детальную информацию (без флага g).
const logLine = 'Ошибка 404: страница не найдена';
const errorRegex = /(\d{3}):\s(.+)/;
const result = logLine.match(errorRegex);
console.log(result[0]); // '404: страница не найдена'
console.log(result[1]); // '404'
console.log(result[2]); // 'страница не найдена'
Метод replace()
Заменяет совпадения на указанную строку или результат функции. Отлично подходит для форматирования данных.
const phone = '+7 (999) 123-45-67';
const cleanPhone = phone.replace(/[\s\-\(\)\+]/g, '');
console.log(cleanPhone); // '79991234567'
// Замена с использованием групп
const date = '2024-01-15';
const formattedDate = date.replace(/(\d{4})-(\d{2})-(\d{2})/, '$3.$2.$1');
console.log(formattedDate); // '15.01.2024'
3. Основные символы и флаги регулярных выражений
Чтобы эффективно работать с regex, нужно понимать базовые метасимволы и флаги. Вот ключевые из них:
Символы для поиска
.— любой символ (кроме перевода строки)\d— цифра (0-9)\w— буква, цифра или подчеркивание\s— пробельный символ^— начало строки$— конец строки*— 0 или более повторений+— 1 или более повторений?— 0 или 1 повторение{n,m}— от n до m повторений
Флаги
g— глобальный поиск (все совпадения, а не первое)i— регистронезависимый поискm— многострочный режим (^ и $ работают для каждой строки)s— точка включает символ перевода строки
// Пример с флагом m
const multiline = `Первая строка
Вторая строка
Третья строка`;
const regexMultiline = /^Вторая/m;
console.log(regexMultiline.test(multiline)); // true
4. Практические примеры для Node.js
Рассмотрим три реальные задачи, которые часто встречаются при разработке на Node.js.
Пример 1: Валидация email
function isValidEmail(email) {
const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
return emailRegex.test(email);
}
console.log(isValidEmail('test@domain.com')); // true
console.log(isValidEmail('user@.com')); // false
Пример 2: Парсинг URL из текста
function extractUrls(text) {
const urlRegex = /https?:\/\/[^\s]+/g;
return text.match(urlRegex) || [];
}
const message = 'Посетите https://example.com и http://test.org для деталей.';
console.log(extractUrls(message));
// ['https://example.com', 'http://test.org']
Пример 3: Обработка логов сервера
const logEntry = '192.168.1.1 - - [10/Jan/2024:12:34:56] "GET /api/data HTTP/1.1" 200 1234';
const logRegex = /^(\S+).+\[(.+)\]\s"(\w+)\s(\/\S+)\sHTTP\/\d\.\d"\s(\d+)\s(\d+)$/;
const parsed = logEntry.match