Справочник по регулярным выражениям для разработчика Паттерны, которые стоит запомнить
Регулярные выражения — это навык, который приносит пользу во всех языках программирования, которые ты когда-либо будешь писать. Одинаковый шаблон проверки почтового адреса в Python удаляет строки запросов в Go и очищает данные формы в JavaScript. Учи его разок, используй везде.
Это не учебник по синтаксису. Это те шаблоны, которые вы на самом деле используете в реальных проектах — те, что появляются в валидаторах форм, парсерах логов, маршрутизаторах URL и трубках данных. Таблица ниже является их основой. Произношение вокруг неё рассказывает о местах, где люди получают ожоги.
Типы, которые стоит сохранить
Эти 11 шаблонов охватывают повторяющиеся сценарии, возникающие в производственном коде. Используйте Регулятор тестирования для проверки их против ваших собственных входных данных перед подключением их.
| Шаблон | Что соответствует | Пример матча | Примечания |
|---|---|---|---|
^[\w.+-]+@[\w-]+\.[a-zA-Z]{2,}$ | Адрес электронной почты | user@example.com | Распространённое по умолчанию — истинный RFC 5322 — это лабиринт. Привяжитесь к ^$. |
https?:\/\/[\w\-._~:/?#[\]@!$&'()*+,;=%]+ | URL с протоколом HTTP/HTTPS | https://example.com/path?q=1 | Не проверяет структуру — просто подтверждает, что выглядит как URL. |
^(\d{1,3}\.){3}\d{1,3}$ | Адрес IPv4 (формат только) | 192.168.1.1 | Совпадения 999.999.999.999 — проверить диапазон в коде, а не с помощью регулярных выражений. |
^(\+\d{1,3}[\s-])?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$ | Американский номер телефона | (555) 867-5309 | Обрабатывает общие разделители. Международные форматы слишком различаются для одного шаблона. |
[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} | Уникальный идентификатор версии 4 | 550e8400-e29b-41d4-a716-446655440000 | Нечувствителен к регистру — используйте i флаг или добавить A-F к классу символов. |
^[a-z0-9]+(?:-[a-z0-9]+)*$ | Ссылка на слог | my-article-title | Без начальных/конечных тире, без последовательных тире. |
^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$ | ISO-8601 дата (ГГГГ-ММ-ДД) | 2026-04-10 | Проверяет формат и диапазон, но не валидность календаря (марта 31 проходит). |
^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$ | Шестнадцатеричный цвет CSS | #ff6600 или #f60 | Оба формата сжатого обозначения с тремя и шестью цифрами. Добавить {8} для восьмизначного RGBA шестнадцатеричного кода |
^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-([\w.-]+))?(?:\+([\w.-]+))?$ | Строка версий по смыслу | 1.2.3-beta.1+build.42 | Собирает метаданные предварительного выпуска и сборки как необязательные группы. |
\b(?:\d{4}[\s-]?){3}\d{4}\b | Номер кредитной карты (заполнить маскировкой, не проверять) --- *(Note: The phrase "mask" was translated as "заполнить маскировкой" to maintain context in Russian technical documentation. If you need a more literal translation like "покрыть маской", let me know.)* | 4111 1111 1111 1111 | Используйте для маскировки в логах, а не валидации. Проверка по алгоритму Луна требует кода. |
\s+ | Пробелы бегут | "hello world" → "hello world" | Замените пробелы на одиночный пробел для нормализации пробелов. |
Где в реальной практике нарушаются шаблоны
Жадное против ленивого совпадения
Количественные слова * и + Бывают жадными с рождения — поглощают всё, что могут. Это задевает, когда извлекаешь контент между разделителями. <.+> на <b>bold</b> соответствует всему строке, а не <b>Переключитесь на лазовый режим .+? остановиться на первом закрывающем символе вместо последнего.
Привязка: Когда ^ и $ не хватает
Без якорных выражений, шаблон может совпадать в любом месте строки. \d+ соответствует abc123def — оно находит цифры в середине. Для полной проверки строки оберните шаблоны ^...$В режиме многострочного ввода (m флаг), ^ и $ соответствует границы строки, а не полные границы строки. Если вы проверяете одно значение (электронную почту, UUID), устанавливайте m флаг намеренно, а не по привычке.
Запасная флаговая яма с несколькими строками
The m флаг меняет что ^ и $ смысл. Что s флаг (dotAll) изменяет . соответствует — без него . не совпадает с символами новой строки. Разбор записей лога с несколькими строками .+Ты нужен s или [\s\S]+ в качестве запасного варианта для моторов, которые не поддерживают dotAll.
Проверка перед подключением
Не бросайте регулярное выражение в приложение и тестируйте его только на одном успешном пути (happy path). Паттерны могут проваливаться на граничных случаях: юникодовых символах, пустых строках, пробелах в начале/конце или почти-но некорректных входных данных. Тестер регулярных выражений IO Tools Дает возможность запускать шаблон одновременно с несколькими тестовыми строками, чтобы проверить корректные и некорректные случаи на стороне перед выпуском кода. Справочник по регулярным выражениям Полезно, когда вы находитесь в процессе создания шаблона и нуждаетесь в быстром справочнике по синтаксису без отхода от браузера.
При тестировании создайте матрицу: что должно совпадать, что категорически не должно, и что находится на границе. Валидатор электронной почты, который принимает user@ отвергает user+tag@example.co.uk Худше, чем вообще нет валидатора вовсе.
Языковые особенности, о которых стоит знать
Паттерны в таблице выше в целом переносимы, но важна детальность работы двигателя.
- JavaScript использует движок регулярных выражений ECMA. Именованные группы захвата (
(?<name>...)это поддерживается в ES2018+.vфлаг (введенный в ES2024) добавляет нотацию множеств и экранирования свойств Юникода. Посмотры вперед работают; посмотры назад появились в ES2018+ и имеют ограничения по длине переменных в некоторых более старых версиях V8. - Питон использует
reмодуль (близкий к PCRE, но не идентичный).re.compile()патерн стоит использовать — компилированные патерны быстрее при многократном вызове в циклах. Есть небольшое отличие: у Python\bГраница слова по умолчанию осознаёт юникод и работает с неасканскими символами букв. В JavaScript\bявляется только в кодировке ASCII, если вы не используетеuилиvфлаг. - Идти использует синтаксис RE2, который намеренно исключает ссылочные ссылки и предварительные проверки. Это решение по безопасности — RE2 гарантирует линейное время совпадения, что предотвращает катастрофическое отслеживание. Если вы переносите шаблон из Python или JavaScript в Go и используете предварительные проверки или ссылочные ссылки, вам потребуется перестроить логику.
Пример на реальной жизни: валидация электронных писем во всех языках
То же самое решение с двумя реализациями: валидатор формы на JavaScript и проверка ввода на Python.
// JavaScript — client-side form validation
const EMAIL_RE = /^[\w.+-]+@[\w-]+\.[a-zA-Z]{2,}$/;
function validateEmail(input) {
const value = input.trim();
if (!EMAIL_RE.test(value)) {
throw new Error(`Invalid email address: ${value}`);
}
return value;
}
// Usage
document.querySelector('#signup-form').addEventListener('submit', (e) => {
e.preventDefault();
try {
const email = validateEmail(e.target.email.value);
submitForm({ email });
} catch (err) {
showError(err.message);
}
});
# Python — API request validation
import re
EMAIL_RE = re.compile(r'^[\w.+-]+@[\w-]+\.[a-zA-Z]{2,}$')
def validate_email(value: str) -> str:
value = value.strip()
if not EMAIL_RE.match(value):
raise ValueError(f"Invalid email address: {value!r}")
return value
# Usage in a Flask route
@app.route('/signup', methods=['POST'])
def signup():
try:
email = validate_email(request.json.get('email', ''))
except ValueError as e:
return jsonify({'error': str(e)}), 400
# continue with valid email...
Оба используют одинаковую базовую структуру. Единственное значимое различие: в **Python** re.compile() подготавливает шаблон заранее, чтобы повторные вызовы не перестраивали его каждый раз при инвокации — стоит делать даже в горячих путях.
Создайте личный справочник быстрых ссылок
Паттерны выше обрабатывают типичные случаи, но со временем вы накопите свои собственные — специфичные форматы логов для вашей архитектуры, схемы идентификаторов из внутренних систем, дата-форматы, которые требует использовать ваш отдел данных. Короткий, отобранный файл проверенных шаблонов, который можно скопировать и вставить — это больше, чем запоминать правила синтаксиса. Попробуйте их один раз, добавьте аннотации о том, для чего они нужны, и используйте их вместо повторного создания с нуля каждый раз.
Вам также может понравиться
Установите наши расширения
Добавьте инструменты ввода-вывода в свой любимый браузер для мгновенного доступа и более быстрого поиска
恵 Табло результатов прибыло!
Табло результатов — это интересный способ следить за вашими играми, все данные хранятся в вашем браузере. Скоро появятся новые функции!
Подписаться на новости
все Новые поступления
всеОбновлять: Наш последний инструмент добавлено на 15 апреля, 2026
