Справочник по регулярным выражениям для разработчика Паттерны, которые стоит запомнить

Опубликовано
Справочник по регулярным выражениям для разработчика: Паттерны, которые стоит запомнить
Реклама · Удалить?

Регулярные выражения — это навык, который приносит пользу во всех языках программирования, которые ты когда-либо будешь писать. Одинаковый шаблон проверки почтового адреса в Python удаляет строки запросов в Go и очищает данные формы в JavaScript. Учи его разок, используй везде.

Это не учебник по синтаксису. Это те шаблоны, которые вы на самом деле используете в реальных проектах — те, что появляются в валидаторах форм, парсерах логов, маршрутизаторах URL и трубках данных. Таблица ниже является их основой. Произношение вокруг неё рассказывает о местах, где люди получают ожоги.

Типы, которые стоит сохранить

Эти 11 шаблонов охватывают повторяющиеся сценарии, возникающие в производственном коде. Используйте Регулятор тестирования для проверки их против ваших собственных входных данных перед подключением их.

ШаблонЧто соответствуетПример матчаПримечания
^[\w.+-]+@[\w-]+\.[a-zA-Z]{2,}$Адрес электронной почтыuser@example.comРаспространённое по умолчанию — истинный RFC 5322 — это лабиринт. Привяжитесь к ^$.
https?:\/\/[\w\-._~:/?#[\]@!$&'()*+,;=%]+URL с протоколом HTTP/HTTPShttps://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}Уникальный идентификатор версии 4550e8400-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() подготавливает шаблон заранее, чтобы повторные вызовы не перестраивали его каждый раз при инвокации — стоит делать даже в горячих путях.

Создайте личный справочник быстрых ссылок

Паттерны выше обрабатывают типичные случаи, но со временем вы накопите свои собственные — специфичные форматы логов для вашей архитектуры, схемы идентификаторов из внутренних систем, дата-форматы, которые требует использовать ваш отдел данных. Короткий, отобранный файл проверенных шаблонов, который можно скопировать и вставить — это больше, чем запоминать правила синтаксиса. Попробуйте их один раз, добавьте аннотации о том, для чего они нужны, и используйте их вместо повторного создания с нуля каждый раз.

Хотите убрать рекламу? Откажитесь от рекламы сегодня

Установите наши расширения

Добавьте инструменты ввода-вывода в свой любимый браузер для мгновенного доступа и более быстрого поиска

в Расширение Chrome в Расширение края в Расширение Firefox в Расширение Opera

Табло результатов прибыло!

Табло результатов — это интересный способ следить за вашими играми, все данные хранятся в вашем браузере. Скоро появятся новые функции!

Реклама · Удалить?
Реклама · Удалить?
Реклама · Удалить?

новости с техническими моментами

Примите участие

Помогите нам продолжать предоставлять ценные бесплатные инструменты

Купи мне кофе
Реклама · Удалить?