Регулярные выражения (Regex) — Примеры
Пример 1 — Шаблон даты, принимающий слишком много
Шаблон задуман для проверки даты, записанной как четыре цифры, дефис, две цифры, дефис и ещё две цифры, и применяется к целому полю формы. А значение ниже, с временем на конце, всё равно проходит. Скажите, что шаблон проверяет на самом деле, и как заставить его отвергать всё, кроме даты самой по себе.
шаблон: \d{4}-\d{2}-\d{2}
принимается шаблоном:
"2026-10-15" да
"2026-10-15T09:00" да <- должно быть отвергнуто
"x 2026-10-15 y" да <- должно быть отвергнуто
Решение
у шаблона нет привязок, поэтому он спрашивает лишь, встречается ли дата
где-то в тексте, — а не является ли датой всё значение.
с привязками: ^\d{4}-\d{2}-\d{2}$
"2026-10-15" совпадает
"2026-10-15T09:00" нет совпадения
"x 2026-10-15 y" нет совпадения
Шаблон без привязок проверяется в каждой позиции строки, поэтому он срабатывает, как только подходит любая подстрока. Это самый частый источник ложных срабатываний при проверке. Каретка прикрепляет совпадение к началу, а привязка конца — к концу, поэтому вместе они требуют, чтобы шаблон потребил всё значение. Ловушка в том, что форма с привязками всё ещё может принять завершающий перевод строки в движках, где привязка конца совпадает прямо перед ним, — так что берите строгую привязку конца, когда ввод приходит из файла.
Пример 2 — Поиск слова, набранного дважды
Редактор должен сообщать о словах, повторённых подряд, например the the. Первая попытка ниже сообщает куда больше, чем нужно. Скажите почему, затем дайте шаблон, который сообщает только о настоящих повторах, и назовите группу, которую он захватывает.
текст: "we we should should read the the spec"
первая попытка: \w+ \w+
совпадения: "we we", "should should", "read the", "the the"
<- "read the" — не повтор
Решение
\b(\w+)\s+\1\b
группа 1 захватывает первое слово; обратная ссылка \1 совпадает с тем же
текстом снова, поэтому второе слово должно быть равно первому.
совпадения: "we we", "should should", "the the" (не "read the")
для "the the": группа 1 = "the"
Обратная ссылка заново совпадает с тем, что захватила группа, поэтому шаблон сравнивает второе слово с первым, а не принимает любое слово подряд, и маркеры границы слова не дают ему совпасть внутри более длинных слов. Ловушка — регистр: The the захватывает The, а затем требует ровно The, поэтому добавьте флаг нечувствительности к регистру, если это должно считаться, или приведите регистр к одному виду до сопоставления.