Регулярные выражения в TypeScript: синтаксис, методы и примеры
Регулярные выражения (regex) — мощный инструмент для работы со строками. В TypeScript они позволяют не только искать, заменять и проверять текст, но и получать строгую типизацию результатов. В этой статье мы разберём все аспекты работы с RegExp в TypeScript: от базового синтаксиса до продвинутых приёмов с примерами кода.
1. Создание регулярных выражений в TypeScript
В TypeScript, как и в JavaScript, существует два способа создания регулярного выражения:
Литеральный синтаксис
Самый распространённый и удобный способ — использовать слеши:
const pattern: RegExp = /hello/gi;
Здесь g — глобальный поиск, i — регистронезависимость. Тип RegExp выводится автоматически, но его можно указать явно для читаемости.
Конструктор RegExp
Используется, когда шаблон формируется динамически:
const searchTerm: string = "world";
const dynamicPattern: RegExp = new RegExp(searchTerm, "gi");
Второй аргумент — строка с флагами. Тип возвращаемого значения — RegExp.
2. Основные методы RegExp и String
TypeScript наследует все методы JavaScript, но добавляет к ним строгую типизацию. Рассмотрим ключевые методы с примерами.
Метод test()
Проверяет, есть ли совпадение в строке. Возвращает boolean.
const emailRegex: RegExp = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
const email: string = "user@example.com";
const isValid: boolean = emailRegex.test(email);
console.log(isValid); // true
Метод exec()
Ищет совпадение и возвращает детальную информацию. Возвращает RegExpExecArray | null.
const text: string = "Цена: 1500 рублей, скидка: 200 рублей";
const pricePattern: RegExp = /(\d+)\s*рублей/g;
let match: RegExpExecArray | null;
while ((match = pricePattern.exec(text)) !== null) {
console.log(`Найдено: ${match[0]}, число: ${match[1]}`);
}
// Вывод:
// Найдено: 1500 рублей, число: 1500
// Найдено: 200 рублей, число: 200
Метод match() строки
Работает аналогично exec(), но вызывается на строке. Возвращает RegExpMatchArray | null.
const phone: string = "Контакты: +7 (999) 123-45-67";
const phoneRegex: RegExp = /\+7\s*\(\d{3}\)\s*\d{3}-\d{2}-\d{2}/;
const result: RegExpMatchArray | null = phone.match(phoneRegex);
if (result) {
console.log(`Найден телефон: ${result[0]}`);
// Найден телефон: +7 (999) 123-45-67
}
Метод replace()
Заменяет совпадения на новую строку. Возвращает string. Поддерживает колбэк для сложных замен.
function formatDate(input: string): string {
const datePattern: RegExp = /(\d{4})-(\d{2})-(\d{2})/;
return input.replace(datePattern, "$3.$2.$1");
}
const isoDate: string = "2025-03-10";
const formatted: string = formatDate(isoDate);
console.log(formatted); // "10.03.2025"
Метод split()
Разбивает строку по регулярному выражению. Возвращает string[].
const data: string = "яблоко;груша;апельсин;банан";
const items: string[] = data.split(/;\s*/);
console.log(items); // ["яблоко", "груша", "апельсин", "банан"]
3. Флаги и их комбинации
Флаги управляют поведением регулярного выражения. В TypeScript они задаются либо в литерале, либо вторым аргументом конструктора.
| Флаг | Описание | Пример |
|---|---|---|
g | Глобальный поиск (все совпадения) | /ab/g |
i | Регистронезависимость | /hello/i |
m | Многострочный режим (^ и $ работают для каждой строки) | /^start/m |
s | Точка соответствует символу перевода строки | /./s |
u | Unicode-режим | /\p{L}/u |
y | Поиск с текущей позиции (sticky) | /foo/y |
Комбинирование флагов: /pattern/gim. Порядок не важен.
const multilineText: string = `Первая строка
вторая строка
Третья строка`;
const startsWithPattern: RegExp = /^\w+/gm;
const matches: string[] = multilineText.match(startsWithPattern) || [];
console.log(matches); // ["Первая", "вторая", "Третья"]
4. Типизация результатов с помощью групп захвата
TypeScript позволяет типизировать результаты через именованные группы захвата. Это делает код безопаснее и читаемее.
Именованные группы
interface DateParts {
year: string;
month: string;
day: string;
}
function parseDate(input: string): DateParts | null {
const dateRegex: RegExp = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
const match: RegExpExecArray | null = dateRegex.exec(input);
if (match?.groups) {
return {
year: match.groups.year,
month: match.groups.month,
day