Регулярные выражения (Regex, от англ. Regular Expressions) — это инструмент для работы с текстом, который используется для поиска, сопоставления и манипулирования строками. Regex применяются в различных задачах вроде валидации ввода, поиска по тексту, замены символов и многим другим.
Основные составляющие регулярных выражений
1. Литералы (буквы и цифры)
Строки, состоящие из букв и цифр, сопоставляются напрямую. Например, регулярное выражение cat найдет строку "cat" в тексте.
2. Специальные символы
Регулярные выражения используют специальные символы для создания более сложных шаблонов:
- . — точка сопоставляется с любым одиночным символом, кроме новой строки.
- ^ — начало строки. Например, ^cat соответствует строкам, которые начинаются с "cat".
- $ — конец строки. Например, cat$ соответствует строкам, которые заканчиваются на "cat".
- * — предшествующий символ или группа может повторяться 0 или более раз.
- + — предшествующий символ или группа может повторяться 1 или более раз.
- ? — предшествующий символ или группа может повторяться 0 или 1 раз (делает символ необязательным).
- | — оператор "или". Например, cat|dog соответствует строкам, содержащим "cat" или "dog".
- [] — набор символов. Например, [abc] соответствует одному из символов "a", "b" или "c".
- () — группировка символов. Например, (cat|dog) соответствует "cat" или "dog".
3. Квантификаторы
Квантификаторы используются для указания повторений символов или групп:
{n} — ровно n повторений. Например, a{3} соответствует "aaa".
{n,} — n или более повторений. Например, a{2,} соответствует "aa", "aaa", и т.д.
{n,m} — от n до m повторений. Например, a{1,3} соответствует "a", "aa" или "aaa".
4. Классы символов
- \d — соответствует любой цифре (0-9).
- \D — соответствует любому символу, кроме цифры.
- \w — соответствует любому "словесному" символу: буквы, цифры и знак подчеркивания (_).
- \W — соответствует любому не "словесному" символу.
- \s — соответствует любому пробельному символу (пробел, табуляция, перенос строки).
- \S — соответствует любому символу, кроме пробельного.
5. Экранирование
Если нужно использовать специальные символы (., *, +, ?, и т.д.) как обычные символы, их нужно экранировать с помощью обратного слэша (\). Например, чтобы найти точку в тексте, нужно использовать выражение \..
Примеры регулярных выражений
1. Поиск всех слов в строке
Регулярное выражение:
\b\w+\b
- \b — граница слова (начало или конец слова).
- \w+ — одно или более "словесных" символов (буквы, цифры или символ подчеркивания _).
Пример:
- Строка: "Hello, world!"
- Матчи: ["Hello", "world"]
2. Нахождение всех цифр в тексте
Регулярное выражение:
\d+
- \d+ — одно или более цифр.
Пример:
- Строка: "There are 123 apples and 45 oranges."
- Матчи: ["123", "45"]
3. Поиск даты в формате "день/месяц/год"
Регулярное выражение:
\b\d{2}/\d{2}/\d{4}\b
- \d{2} — два символа, представляющие день или месяц.
- \d{4} — четыре символа, представляющие год.
- \b — граница слова.
Пример:
- Строка: "Мой день рождения 25/12/1995."
- Матчи: ["25/12/1995"]
4. Поиск времени в формате "часы:минуты"
Регулярное выражение:
\b(?:[01]\d|2[0-3]):[0-5]\d\b
- [01]\d — часы от 00 до 19.
- 2[0-3] — часы от 20 до 23.
- [0-5]\d — минуты от 00 до 59.
- \b — граница слова.
Пример:
- Строка: "Встреча в 14:30 или 09:45."
- Матчи: ["14:30", "09:45"]
5. Поиск 16-значного номера кредитной карты
Регулярное выражение:
\b\d{4}[- ]?\d{4}[- ]?\d{4}[- ]?\d{4}\b
- \d{4} — четыре цифры.
- [- ]? — необязательный пробел или тире между группами цифр.
- \b — граница слова.
Пример:
- Строка: "Номер карты: 1234-5678-9012-3456 или 1234567890123456."
- Матчи: ["1234-5678-9012-3456", "1234567890123456"]
6. Поиск URL (веб-ссылок)
Регулярное выражение:
https?:\/\/(www\.)?[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}([\/\w .-]*)*\/?
- https? — протокол (http или https).
- :\/\/ — символы "://" после протокола.
- (www.)? — необязательное "www".
- [a-zA-Z0-9.-]+ — доменное имя, состоящее из букв, цифр, точек и дефисов.
- .[a-zA-Z]{2,6} — доменная зона (например, .com, .net, .org).
- ([\/\w .-]) — необязательный путь (слеши, буквы, цифры, точки и дефисы).
Пример:
- Матчи: ["https://www.example.com", "http://example.org/test"]
7. Поиск пароля с минимальными требованиями (8 символов, хотя бы одна буква и одна цифра)
Регулярное выражение:
(?=.*[a-zA-Z])(?=.*\d)[a-zA-Z\d]{8,}
- (?=.*[a-zA-Z]) — позитивная проверка наличия хотя бы одной буквы.
- (?=.*\d) — позитивная проверка наличия хотя бы одной цифры.
- [a-zA-Z\d]{8,} — пароль длиной не менее 8 символов, состоящий из букв и цифр.
Пример:
- Строка: "Pass1234"
- Матч: ["Pass1234"]
8. Поиск текста в кавычках
Регулярное выражение:
"(.*?)"
- " — открывающая и закрывающая кавычки.
- .*? — любой текст (ленивый квантификатор, чтобы захватывать минимально возможное количество символов).
Пример:
- Строка: Она сказала: "Привет!"
- Матчи: ["Привет!"]
9. Нахождение повторяющихся слов
Регулярное выражение:
\b(\w+)\b\s+\b\1\b
- (\w+) — захватываемое слово.
- \1 — повтор слова (ссылка на первую захваченную группу).
- \s+ — один или более пробелов между словами.
Пример:
- Строка: "Это тест тест на повторение."
- Матчи: ["тест тест"]
10. Поиск шестнадцатеричных цветовых кодов (например, #FF5733)
Регулярное выражение:
#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})
- # — символ решетки.
- [a-fA-F0-9]{6} — 6 символов в диапазоне (буквы от A до F (в обоих регистрах) и цифры от 0 до 9).
- [a-fA-F0-9]{3} — допускается также краткая форма из 3 символов.
Пример:
- Матчи: ["#FF5733", "#FFF"]
11. Поиск комментариев в коде (например, C++, Java, JavaScript)
Регулярное выражение для однострочных комментариев (начинающихся с //):
//.*
- // — символы начала комментария.
- .* — любой текст до конца строки.
Пример:
- Строка: int x = 5; // это переменная
- Матчи: ["// это переменная"]
Регулярное выражение для многострочных комментариев (начинающихся с /* и заканчивающихся на */):
/\*[\s\S]*?\*/
- /* — начало комментария.
- [\s\S]*? — любой текст (включая переходы на новую строку).
- */ — конец комментария.
Пример:
- Строка: /* Это многострочный комментарий */
- Матч: ["/* Это многострочный комментарий */"]
12. Поиск MAC-адреса
Регулярное выражение:
\b([0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2}\b
- [0-9A-Fa-f]{2} — два шестнадцатеричных символа.
- [:-] — двоеточие или тире между группами.
- {5} — повторение группы 5 раз.
- \b — граница слова.
Пример:
- Строка: "MAC: 00:1A:2B:3C:4D:5E или 00-1A-2B-3C-4D-5E"
- Матчи: ["00:1A:2B:3C:4D:5E", "00-1A-2B-3C-4D-5E"]
Еще немного примеров:
13. Поиск email-адресов:
[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
Это выражение найдет строки, которые могут быть email-адресами, состоящими из букв, цифр и некоторых специальных символов.
14. Поиск IP-адресов:
\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b
Это выражение найдет IP-адреса в формате "xxx.xxx.xxx.xxx", где каждая часть состоит из 1-3 цифр.
15. Поиск номера телефона:
\+?\d{1,3}[-.\s]?\(?\d{1,4}\)?[-.\s]?\d{1,4}[-.\s]?\d{1,9}
Это регулярное выражение найдет телефонные номера с международным кодом и различными форматами (с пробелами, точками, скобками и тире).
16. Поиск HTML-тегов:
<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)
Это выражение найдет все HTML-теги в тексте.
Практическое применение
- Поиск и замена в текстах:
С помощью регулярных выражений можно легко находить и заменять части текста. Например, в текстовом редакторе можно заменить все номера телефонов в определённом формате.
- Валидация ввода:
Регулярные выражения часто используются для проверки корректности ввода, например, email-адресов, номеров телефонов или паролей.
- Парсинг текста:
С их помощью можно извлекать информацию из текста, например, вытаскивать цифры, даты или другие конструкции.
Популярные библиотеки для работы с регулярными выражениями
- Python: Модуль re
- JavaScript: Класс RegExp и методы строк
- Java: Класс Pattern и Matcher
- PHP: Функции preg_match, preg_replace и другие
Заключение
Регулярные выражения — это хороший инструмент, который позволяет эффективно работать с текстом, находить и изменять нужные элементы.
Однако, несмотря на их гибкость и мощь, они могут быть сложными для понимания и использования, особенно для новичков. Тем не менее, освоив основы, регулярные выражения могут значительно облегчить работу с текстом и данными.
Если Вам интересно, что еще можно найти на канале QA Helper, прочитайте статью: Вместо оглавления. Что вы найдете на канале QA Helper - справочник тестировщика?
Подписывайтесь в на мой канал в Телеграмм.
Не забудьте подписаться на канал, чтобы не пропустить полезную информацию: QA Helper - справочник тестировщика
Пишите в комментариях какой пункт было бы интересно рассмотреть более подробно.
Обязательно прочитайте: Что должен знать и уметь тестировщик
Также будет интересно почитать: Вопросы которые задают на собеседовании тестировщикам