Регулярные выражения в JavaScript с примерами: на практике
Регулярные выражения (RegExp) — это мощный инструмент для поиска, замены и валидации текста. В JavaScript, особенно в среде Node.js, они применяются повсеместно: от парсинга логов до проверки форм. В этой статье мы разберём синтаксис, методы и напишем практические примеры, которые вы сможете сразу использовать в своих проектах.
1. Основы синтаксиса и создание RegExp
В JavaScript регулярное выражение можно создать двумя способами: литералом и конструктором. Литерал удобен для статических паттернов, конструктор — для динамических.
// Литерал (рекомендуется)
const regexLiteral = /hello/gi;
// Конструктор (для динамических паттернов)
const pattern = "hello";
const flags = "gi";
const regexConstructor = new RegExp(pattern, flags);
Флаги (модификаторы):
g— глобальный поиск (находит все совпадения, а не первое)i— регистронезависимый поискm— многострочный режим (якоря^и$работают для каждой строки)s— позволяет точке.совпадать с символом новой строкиu— включает полную поддержку Unicode
Базовые метасимволы:
.— любой символ, кроме новой строки\d— цифра (0-9)\w— буква, цифра или подчёркивание\s— пробельный символ (пробел, табуляция, перевод строки)^— начало строки$— конец строки[]— класс символов (например[a-z]— все строчные буквы)()— группа захвата|— логическое ИЛИ
2. Основные методы для работы с регулярными выражениями
В JavaScript есть несколько методов, которые работают с RegExp. Рассмотрим их на практических примерах.
2.1. test() — проверка на совпадение
Метод возвращает true или false. Идеален для валидации.
const emailPattern = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
const emails = ["user@example.com", "invalid-email", "test@domain.co.uk"];
emails.forEach(email => {
console.log(`${email}: ${emailPattern.test(email)}`);
});
// user@example.com: true
// invalid-email: false
// test@domain.co.uk: true
2.2. exec() — поиск с деталями
Возвращает массив с совпадением и группами захвата. Удобен для извлечения данных.
const logLine = "ERROR: 2023-10-15 14:30:00 - Server crash";
const logPattern = /^(ERROR|WARN|INFO): (\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) - (.+)$/;
const result = logPattern.exec(logLine);
if (result) {
console.log(`Уровень: ${result[1]}`);
console.log(`Дата: ${result[2]}`);
console.log(`Сообщение: ${result[3]}`);
}
// Уровень: ERROR
// Дата: 2023-10-15 14:30:00
// Сообщение: Server crash
2.3. match() — поиск в строке
Метод строки, который возвращает массив совпадений. С флагом g — все совпадения, без — первое с группами.
const text = "Тел: +7(999)123-45-67, +7(495)765-43-21";
const phonePattern = /\+7\(\d{3}\)\d{3}-\d{2}-\d{2}/g;
const phones = text.match(phonePattern);
console.log(phones);
// ['+7(999)123-45-67', '+7(495)765-43-21']
2.4. replace() — замена текста
Позволяет заменить совпадения на новую строку. Поддерживает специальные символы, такие как $1 для групп захвата.
const messyDate = "2023/10/15";
const cleanDate = messyDate.replace(/(\d{4})\/(\d{2})\/(\d{2})/, "$3.$2.$1");
console.log(cleanDate); // 15.10.2023
// Маскировка email
const email = "john.doe@example.com";
const masked = email.replace(/(.{2})(.*)(@.*)/, "$1***$3");
console.log(masked); // jo***@example.com
2.5. split() — разделение строки
Метод строки, который может использовать RegExp для разделения.
const csvLine = "apple, banana; cherry| date";
const items = csvLine.split(/[,;|]\s*/);
console.log(items); // ['apple', 'banana', 'cherry', 'date']
3. Практические примеры для Node.js
Рассмотрим задачи, которые часто встречаются в реальной разработке на Node.js.
3.1. Валидация пароля
Пароль должен содержать минимум 8 символов, хотя бы одну заглавную букву, одну строчную, одну цифру и один спецсимвол.
const passwordPattern = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*()_+])[A-Za-z\d!@#$%^&*()_+]{8,}$/;
const passwords = ["Weak1!", "StrongPass1!", "short1A!"];
passwords.forEach(pwd => {
console.log(`${pwd}: ${passwordPattern.test(pwd)}`);
});
// Weak1!: false (нет заглавной)
// StrongPass1!: true
// short1A!: false (менее 8 символов)
3.2. Парсинг URL из текста
Извлечение всех HTTP/HTTPS ссылок из произвольного текста.
function extractURLs(text) {
const urlPattern = /https?:\/\/[^\s"'<>()]+