Регулярные выражения для начинающих: как писать регулярные выражения
Регулярные выражения для начинающих
Регулярные выражения — regex — это шаблоны, описывающие текст. С помощью regex можно искать строки, проверять ввод, извлекать данные и выполнять сложный поиск с заменой, используя одно компактное выражение. Как только вы поймёте основы, regex станет одним из самых мощных инструментов в вашем арсенале программиста.
Что такое регулярное выражение?
Regex — это последовательность символов, определяющая шаблон поиска. Шаблон \d{3}-\d{2}-\d{4} соответствует номеру социального страхования США: три цифры, дефис, две цифры, дефис, четыре цифры.
Движки регулярных выражений существуют практически во всех языках программирования — JavaScript, Python, Java, Ruby, Go — все имеют встроенную поддержку.
Литеральные символы
Большинство символов соответствуют сами себе. Шаблон cat соответствует буквальной строке «cat» везде, где она встречается.
Pattern: cat
Matches: "cat" в "The cat sat on the mat."
Matches: "cat" в "catalog"
Литеральное сопоставление просто, но ограничено. Настоящая сила заключается в метасимволах.
Метасимволы
Эти символы имеют специальное значение и должны быть экранированы с помощью \, чтобы сопоставляться буквально:
. ^ $ * + ? { } [ ] \ | ( )
Классы символов
Классы символов сопоставляют один символ из набора.
Квадратные скобки
| Шаблон | Соответствует |
|---------|---------|
| [aeiou] | Любая гласная |
| [0-9] | Любая цифра |
| [a-zA-Z] | Любая буква |
| [^0-9] | Любой символ, который НЕ является цифрой |
Предопределённые классы
| Сокращение | Описание |
|-----------|-------------|
| \d | Любая цифра (аналог [0-9]) |
| \w | Буква, цифра или подчёркивание |
| \s | Пробел, табуляция, перевод строки |
| \D | Любой не-цифровой символ |
| \W | Любой не-словесный символ |
| \S | Любой не-пробельный символ |
| . | Любой символ, кроме перевода строки |
Квантификаторы
Квантификаторы управляют тем, сколько раз должен появиться предшествующий элемент.
| Квантификатор | Значение | Пример | Соответствует |
|------------|---------|---------|---------|
| * | Ноль или более | a* | "", "a", "aa" |
| + | Один или более | a+ | "a", "aa", "aaa" |
| ? | Ноль или один | colou?r | "color", "colour" |
| {3} | Ровно N | \d{3} | "123" |
| {2,4} | От N до M | \d{2,4} | "12", "123", "1234" |
Примеры
\d+ → "42" в "Answer is 42"
https?:// → "http://" и "https://"
Якоря
Якоря сопоставляют позиции, а не символы.
| Якорь | Значение |
|--------|---------|
| ^ | Начало строки |
| $ | Конец строки |
| \b | Граница слова |
| \B | Не-граница слова |
^hello → соответствует "hello" только в начале
end$ → соответствует "end" только в конце
\bword\b → соответствует "word" как целому слову, а не внутри "sword"
Группы и альтернация
Захватывающие группы ( ) извлекают совпавшие части:
(\d{3})-(\d{4}) → "555-1234", захватывает "555" в группу 1, "1234" в группу 2
Незахватывающие группы (?: ) группируют без извлечения:
(?:https?|ftp):// → "http://", "https://", "ftp://"
Альтернация | действует как ИЛИ:
cat|dog|bird → соответствует "cat", "dog" или "bird"
Практические примеры регулярных выражений
| Назначение | Шаблон |
|----------|---------|
| Телефон США | \d{3}-\d{3}-\d{4} |
| Email (простой) | \S+@\S+\.\S+ |
| IP-адрес | \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} |
| Хештег | #[a-zA-Z]\w* |
| Время (ЧЧ:ММ) | [01]\d|2[0-3]:[0-5]\d |
Как протестировать шаблон регулярного выражения
Всегда тестируйте шаблоны интерактивно:
- Введите шаблон регулярного выражения.
- Введите тестовую строку.
- Посмотрите, какие части совпадают в реальном времени.
- Скорректируйте и повторите.
Используйте инструмент тестера регулярных выражений для экспериментов с шаблонами. Он выделяет совпадения, показывает группы захвата и помогает понять, что именно делает каждая часть вашего выражения.