Три главных практических случая regex
На практике regex сводится к трем типам операций:
- Проверка: определить, соответствует ли текст формату (например, email, телефон)
- Извлечение: найти в тексте то, что подходит под шаблон (например, все URL, все суммы)
- Замена: заменить часть, подходящую под шаблон, на другую (например, унифицировать формат даты, маскировать телефон)
Ниже — разбор реальных случаев.
Случаи проверки
Проверить номер телефона
Regex: ^1[3-9]\d{9}$
Совет: используйте ^ и $ для привязки начала и конца, чтобы вся строка была номером телефона, а не более длинным текстом, его содержащим. Вторая цифра ограничена 3~9 по текущим правилам диапазонов.
Проверить email
Regex: ^[\w.-]+@[\w.-]+.\w+$
Совет: упрощенной версии достаточно; строгая regex для email крайне сложна. В реальных проектах используйте упрощенную версию + отправку проверочного письма как двойную гарантию.
Проверить удостоверение личности
Regex: ^\d{17}[\dXx]$
Совет: 18 знаков, первые 17 — цифры, последний — цифра или X. Эта regex проверяет только формат, не контрольный разряд.
Проверить URL
Regex: ^https?://[\w.-]+
Совет: начинается с http или https, затем домен. Упрощенная версия; полная regex для URL крайне сложна.
Случаи извлечения
Извлечь все номера телефонов
Regex: 1[3-9]\d{9}
Без ^ и $ находит все номера телефонов в тексте. Используйте глобальный поиск (флаг g).
Извлечь все URL
Regex: https?://[\w./?=&%-]+
Соответствует URL, начинающимся с http(s). Реальные символы URL сложнее; корректируйте набор символов по необходимости.
Извлечь все суммы
Regex: [¥$]\d+(?:.\d+)?
Соответствует суммам, начинающимся с ¥ или $, с необязательной дробной частью. Например: ¥100, $99.9.
Извлечь содержимое HTML-тегов
Regex: <a[^>]*>([^<]+)
Извлекает текст внутри тега a. Группа в скобках захватывает текстовое содержимое. Учтите, что regex для обработки HTML недостаточно надежен; для сложного HTML стабильнее использовать парсер.
Случаи замены
Маскировка телефона
Заменить 4 средние цифры на звездочки: 1[3-9]\d{9} заменить, сохранив первые 3 и последние 4.
На практике используйте группы захвата: regex (1[3-9]\d)\d{4}(\d{4}), заменить на 1\1****\2. \1 и \2 ссылаются на группы.
Унифицировать формат даты
Преобразовать 2026/07/12 в 2026-07-12: regex (\d{4})/(\d{2})/(\d{2}), заменить на \1-\2-\3.
Удалить лишние пробелы
Несколько идущих подряд пробелов превратить в один: regex \s+, заменить на одиночный пробел.
Удалить HTML-теги
Убрать все HTML-теги, оставив только текст: regex <[^>]+>, заменить на пусто. Учтите, что символ > внутри атрибутов тега может быть потерян; в сложных случаях используйте парсер.
Советы по отладке
Проверяйте шаг за шагом в инструменте тестирования
Используйте инструмент тестирования regex:
- Введите regex
- Введите тестовый текст (с примерами, которые должны и не должны совпадать)
- Посмотрите подсвеченные результаты
- Пошагово корректируйте regex, пока результат не станет верным
Сначала совпадение, потом оптимизация
Сначала напишите regex, который совпадает; затем думайте об оптимизации (производительность, точность). Не гонитесь за идеалом с самого начала.
Используйте онлайн-визуализацию regex
Сложный regex разбивайте визуализатором, чтобы понять смысл каждой части.
Учитывайте граничные случаи
- Пустая строка
- Строки с частичным совпадением
- Строки со специальными символами
- Очень длинные строки
Переиспользуемые шаблоны regex
Китайские символы
[\u4e00-\u9fa5]+
Почтовый индекс
^\d{6}$
Номер QQ
^[1-9]\d{4,10}$
Шестнадцатеричный цвет
^#[0-9a-fA-F]{6}$
Номер версии
^\d+.\d+.\d+$
Частые ловушки
Жадное сопоставление
.* захватывает слишком много. Для извлечения содержимого тегов используйте [^<]+ вместо .*, чтобы не захватывать между тегами.
Спецсимволы без экранирования
Сопоставление метасимволов — точки, звездочки, вопросительного знака — требует экранирования. Чтобы сопоставить саму обратную косую черту, пишите \.
Сопоставление между строками
По умолчанию . не соответствует переносам строки. Для многострочного текста включите single-line режим или используйте [\s\S] для сопоставления любого символа.
Проблемы производительности
Catastrophic backtracking (катастрофический возврат): вложенные квантификаторы вроде (a+)+ на некоторых входах крайне медленны. В сложном regex следите за производительностью; для слишком длинного текста сначала обрежьте, потом сопоставляйте.
Итог
Практика regex делится на проверку, извлечение и замену. Проверка использует привязку ^ и $, извлечение — глобальный поиск, замена — ссылки на группы захвата. Сначала проверяйте regex инструментом, затем оптимизируйте. Запомните несколько частых шаблонов (телефон, email, дата, URL) — этого хватит на каждый день. Инструмент тестирования regex от DocsAll работает в браузере: пишете и сразу проверяете, текст не загружается.