Регулярные выражения (Regex): Полное руководство
Регулярные выражения (Regex) — это мощный синтаксис, который позволяет сопоставлять строки с определенными шаблонами. Представьте их как продвинутый поиск текста, использующий квантификаторы, коллекции символов, специальные токены и группы захвата для создания чрезвычайно сложных поисковых шаблонов.
Regex необходим для таких задач, как:
- Анализ вывода командной строки
- Парсинг пользовательского ввода
- Изучение логов серверов или программ
- Работа с текстовыми файлами с согласованным синтаксисом (CSV и др.)
- Чтение конфигурационных файлов
- Поиск и рефакторинг кода
1. Шпаргалка по Regex (Cheat Sheet)
Квантификаторы
| Токен | Описание |
|---|---|
a|b | Соответствует либо "a", либо "b" |
? | Ноль или один раз |
+ | Один или более раз |
* | Ноль или более раз |
*? | Ноль или более, но остановиться после первого совпадения |
{N} | Ровно N раз |
{N, M} | От N до M раз |
Общие токены
| Токен | Описание |
|---|---|
. | Любой символ |
\n | Перенос строки |
\t | Табуляция |
\s | Любой пробельный символ (включая \t, \n и др.) |
\S | Любой непробельный символ |
\w | Любой "словный" символ (буквы A-Z, a-z, цифры 0-9 и _) |
\W | Любой символ, не являющийся "словны м" |
\b | Граница слова (совпадает между символами) |
\B | Не граница слова |
^ | Начало строки |
$ | Конец строки |
\\ | Обратный слеш (буквально "") |
Коллекции шаблонов (Pattern Collections)
| Токен | Описание |
|---|---|
[A-Z] | Соответствует любой заглавной букве от "A" до "Z" |
[a-z] | Соответствует любой строчной букве от "a" до "z" |
[0-9] | Соответствует любой цифре |
[asdf] | Соответствует любому из символов "a", "s", "d" или "f" |
[^asdf] | Соответствует любому символу, кроме "a", "s", "d", "f" |
Флаги
| Токен | Описание |
|---|---|
g | Глобальный поиск, найти все вхождения |
m | Многострочный поиск, $ и ^ работают для каждой строки в отдельности |
i | Игнорировать регистр |
Группы
| Токен | Описание |
|---|---|
(...) | Захватывающая группа |
(?:...) | Незахватывающая группа |
(?<name>...) | Именованная группа захвата с именем "name" |
Именованные обратные ссылки
| Токен | Описание |
|---|---|
\k<name> | Ссылка на именованную группу захвата "name" в запросе |
Проверки (Lookahead и Lookbehind)
| Токен | Описание |
|---|---|
(?!) | Отрицательная проверка вперед (Negative lookahead) |
(?=) | Положительная проверка вперед (Positive lookahead) |
(?<!) | Отрицательная проверка назад (Negative lookbehind) |
(?<=) | Положительная проверка назад (Positive lookbehind) |
2. Основы: Как выглядит регулярное выражение?
В простейшем виде регулярное выражение выглядит как слово, которое вы ищете: /Test/ соответствует слову "Test".
Однако регулярные выражения могут быть гораздо сложнее. Например, шаблон номера телефона:
^(?:\d{3}-){2}\d{4}$
Шаблон: ^(?:\d{3}-){2}\d{4}$
Совпадение: "555-555-5555"
Нет совпадения: "555-abc-5555"
Более читаемая (но длинная) версия того же регулярного выражения:
^[0-9]{3}-[0-9]{3}-[0-9]{4}$
3. Как читать и писать регулярные выражения
Квантификаторы
Квантификаторы определяют, сколько раз символ или группа должны быть найдены:
a|b: Соответствует либо "a", либо "b"?: Ноль или один раз+: Один или более раз*: Ноль или более раз{N}: Ровно N раз{N,}: N или более раз{N,M}: От N до M раз*?: Ноль или более, но остановиться после первого совпадения (ленивый поиск)
Пример: Hello{1,3}
Шаблон: Hello{1,3}
Совпадения: "Hello", "Helloo", "Hellooo"
Комбинированный пример: He?llo{2}
Шаблон: He?llo{2}
Совпадения: "Helloo", "Hlloo"
Жадный и ленивый поиск
По умолчанию квантификаторы являются жадными — они захватывают как можно больше.
Hi+соответствует "Hi" и "Hiiiiii".Hi+?(ленивый) соответствует только "Hi", даже если дальше следуют другие "i".
Использование . (любой символ) with жадным/ленивым поиском:
H.*llo(жадный)
Строка: "Hellollollo"
Совпадение: "Hellollollo"
H.*?llo(ленивый)
Строка: "Hellollollo"
Совпадение: "Hello"
Коллекции шаблонов (Pattern Collections)
Коллекции позволяют искать набор символов:
[A-Z]: Любая заглавная буква[a-z]: Любая строчная буква[0-9]: Любая цифра[asdf]: Любой из символов "a", "s", "d", "f"[^asdf]: Любой символ, кроме "a", "s", "d", "f"[0-9A-Z]: Любая цифра или заглавная буква
Комбинирование с токенами: Вы можете включать токены в коллекции. Например, [A-Z\s] соответствует любой заглавной букве или пробельному символу.
Общие токены
.: Любой символ\n: Перенос строки\t: Табуляция\s: Любой пробельный символ (пробел, табуляция, перенос строки)\S: Любой непробельный символ\w: Любой "словный" символ (буквы A-Z, a-z, цифры 0-9 и_)\W: Любой символ, не являющийся "словным"\b: Граница слова (край между\wand\W). Совпадает между символами.
Шаблон: \b\w+\b
Строка: "This is a string"
Совпадения: "This", "is", "a", "string"
\B: Не граница слова^: Начало строки
Шаблон: ^\w+
Строка: "This is a string"
Совпадение: "This"
$: Конец строки
Шаблон: \w+$
Строка: "This is a string"
Совпадение: "string"
\\: Обратный слеш (literal backslash)
Пример границ строк: $\s+ можно использовать для поиска всех пробельных символов между концом одной строки и началом следующей (полезно для минификации).
Экранирование символов
Чтобы найти символы, которые имеют специальное значение в регулярных выражениях (например, ., *, \), используйте обратный слеш для их экранирования:
\\nсоответствует строке "\n" буквально, а не переносу строки.