Регулярные выражения: справочник и тренажёр
Сначала разберитесь в шаблонах по справочнику и песочнице, затем потренируйтесь: выбирайте готовые регулярные выражения или пишите свои, а совпадения подсвечиваются сразу.
Что такое регулярное выражение
Представьте, что у вас есть большой текст и нужно найти в нём не просто слово «кот», а, например, «любое слово из трёх букв, которое начинается на „к“ и заканчивается на „т“».
Регулярные выражения (или «регэкспы») — это способ описать шаблон (правило), по которому программа будет искать, проверять или заменять текст. Простыми словами, это язык для описания текстовых шаблонов.
Аналогия из жизни
Представьте, что вы работаете в библиотеке и отбираете книги по очень странному критерию:
- название начинается на букву «А»;
- дальше идут ровно три цифры;
- заканчивается всё словом «роман».
Вы не перебираете все книги подряд, а пишете помощнику инструкцию: «Ищи те, где сначала буква А, потом три любые цифры, потом слово роман». Регулярное выражение — это такая же инструкция, только для компьютера.
Из чего это состоит
В регулярных выражениях есть специальные символы, которые заменяют собой «что угодно» или «сколько угодно»:
- Обычные буквы (кот) — ищут просто «кот».
- Точка (.) — «любой один символ»: шаблон к.т найдёт «кот», «кит», «к%т».
- Звёздочка (*) — «ноль или больше повторений предыдущего»: ко*т найдёт «кт», «кот», «коот», «кооот».
- Квадратные скобки ([а-я]) — «любая буква из диапазона»; [0-9] — любая цифра.
- Фигурные скобки ({3}) — «ровно 3 раза»: [0-9]{3} — ровно три цифры.
Зачем это нужно
- Поиск и замена. Найти в документе все номера телефонов или адреса почты и заменить их на что-то другое.
- Проверка данных (валидация). Убедиться, что введён правильный адрес почты (есть «собака» и точка) или что пароль содержит и цифры, и буквы.
- Программирование. Разбор текста, вытаскивание нужной информации из логов, обработка данных.
Важное предупреждение
Регулярные выражения выглядят как «каша из символов». Вот пример проверки адреса почты:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
Такие шаблоны сложно читать и легко ошибиться. Запомните главное: регулярка — это не поиск конкретного слова, а описание правил, которым это слово должно соответствовать.
Экранирование спецсимволов
Обычные символы совпадают сами с собой: шаблон кот найдёт «кот». Если же нужен сам спецсимвол (точка, скобка, звёздочка), его «экранируют» обратным слешем: \. — точка, \( — открывающая скобка, \* — звёздочка.
Классы символов
Класс […] — это «один из перечисленных символов». [тТ] — «т или Т». Внутри класса задают диапазоны: [А-Я] — заглавные русские буквы, [а-я] — строчные. Любая русская буква — [А-Яа-яЁё] (буквы «ё» добавляют отдельно).
Крышка в начале класса, [^…], означает «любой символ, кроме перечисленных»: [^А-Яа-я] — не русская буква.
Дефис в классе
Дефис внутри класса означает диапазон, поэтому сам дефис ставят в самый конец: [А-Яа-яЁё-] — буквы и дефис. Тогда дефис считают частью слова: «что-то» — одно сложное слово.
«Или», группы и повторы
A|B — «A или B». Круглые скобки группируют: (то|на). Повторы: * — ноль и более раз, + — один и более, ? — ноль или один, {2,3} — от двух до трёх раз.
Границы слов
Обычно границу слова задают как \b, но в JavaScript и части редакторов \b считает буквами только латиницу — с кириллицей он не работает. Поэтому в русском тексте границу задают явным классом [А-Яа-яЁё-].
Просмотры (lookaround)
Просмотр проверяет соседний символ, но не включает его в совпадение: (?=…) — «дальше идёт …», (?!…) — «дальше не …», (?<=…) — «перед этим было …», (?<!…) — «перед этим не …».
Так из сочетания делают «внутри слова»: [тТ]о(?=[А-Яа-яЁё-])|(?<=[А-Яа-яЁё-])[тТ]о.
Флаги
Флаги включают режимы поиска: i — не учитывать регистр, g — искать все совпадения, u — юникодный режим (корректная работа с не-латиницей). В задании 10 регистр удобнее задавать классом [тТ], а не флагом: тогда оба варианта написания видны прямо в шаблоне.
Готовые формулы для задания 10
| Что найти в тексте | Шаблон |
|---|---|
| все вхождения «то» и «То» | [тТ]о |
| только внутри слов (дефис — часть слова) | [тТ]о(?=[А-Яа-яЁё-])|(?<=[А-Яа-яЁё-])[тТ]о |
| только отдельные слова | (?<![А-Яа-яЁё-])[тТ]о(?![А-Яа-яЁё-]) |
| только строчное «то» | то |
| слово целиком, содержащее «то» | [А-Яа-яЁё-]*то[А-Яа-яЁё-]* |
Движки и совместимость
Синтаксис почти одинаков в LibreOffice Writer (движок ICU), JavaScript и Python, но детали отличаются. Практический вывод: не полагайтесь на \b для кириллицы и проверяйте шаблон на небольшом фрагменте в песочнице, прежде чем применять ко всему документу.
Как пользоваться этим режимом. Изучите теорию и попробуйте шаблоны в песочнице: совпадения подсветятся, а счётчик покажет их число. Затем перейдите к тренажёру — выберите уровень и либо выберите готовый шаблон, либо напишите свой.
Песочница: проверь шаблон
Введите регулярное выражение — совпадения в тексте подсветятся, а счётчик покажет их число. Текст можно заменить на свой.
Совпадений: 12.
Тренажёр: найди правильный ответ
Найдите регулярное выражение, которое правильно находит все подходящие вхождения по условию.
Загрузка практикума…