Введение
Регулярные выражения (или RegEx) — это мощный инструмент для поиска, обработки и манипулирования текстовыми данными. Они используются во многих языках программирования и текстовых редакторах для решения разнообразных задач, связанных с анализом и преобразованием строк.
В этом руководстве мы подробно рассмотрим, что такое регулярные выражения, как они работают, и приведем множество примеров их практического применения.
Содержание
- Что такое регулярные выражения?
- Основные концепции
- Литералы
- Метасимволы
- Специальные символы и их значения
- Точки (
.) - Квантификаторы (
*,+,?,{n,m}) - Якоря (
^,$) - Символьные классы (
[]) - Группы и захваты (
()) - Альтернация (
|) - Обратные ссылки (
\1,\2, и т.д.)
- Точки (
- Предварительные классы символов
- Сокращенные записи
- Жадные и ленивые квантификаторы
- Просмотр вперед и назад
- Положительный и отрицательный просмотр
- Практические примеры применения
- Валидация адреса электронной почты
- Поиск IP-адресов в тексте
- Извлечение URL из строки
- Замена номеров телефонов на маскированный формат
- Удаление HTML-тегов из текста
- Регулярные выражения в различных языках программирования
- Python
- JavaScript
- PHP
- Java
- Советы и рекомендации
- Заключение
- Дополнительные ресурсы
Что такое регулярные выражения?
Регулярное выражение — это последовательность символов, определяющая шаблон поиска в тексте. Этот шаблон может использоваться для проверки соответствия строк, поиска, замены или разбиения текста.
Регулярные выражения широко применяются для:
- Валидации вводимых данных (например, проверка правильности адреса электронной почты).
- Поиска и замены текста в файлах.
- Извлечения определенных данных из больших текстовых массивов.
- Обработки логов и анализа данных.
Основные концепции
Литералы
Самый простой тип регулярного выражения — это последовательность литералов. Например, регулярное выражение cat будет искать точное совпадение со словом «cat» в тексте.
Пример:
Текст: The cat sat on the mat.
Регулярное выражение: cat
Совпадение: cat
Метасимволы
Метасимволы — это специальные символы в регулярных выражениях, которые имеют особое значение. Они позволяют создавать более сложные и гибкие шаблоны.
Основные метасимволы:
.(точка)^и$*,+,?,{n,m}[],(),|\(обратный слеш) для экранирования и специальных последовательностей
Специальные символы и их значения
Точки (.)
Точка соответствует любому одиночному символу (кроме символа новой строки в большинстве реализаций).
Пример:
Регулярное выражение: c.t
Совпадает с: "cat", "cut", "c9t", "c t"
Не совпадает с: "ct", "cart"
Квантификаторы (*, +, ?, {n,m})
Квантификаторы определяют количество повторений предыдущего элемента.
*— соответствует 0 или более повторений.+— соответствует 1 или более повторений.?— соответствует 0 или 1 повторению.{n}— соответствует точноnповторениям.{n,}— соответствуетnили более повторениям.{n,m}— соответствует отnдоmповторениям.
Примеры:
ca*tсоответствует «ct», «cat», «caaat».ca+tсоответствует «cat», «caaat», но не «ct».ca?tсоответствует «ct» и «cat», но не «caaat».a{3}соответствует «aaa».a{2,4}соответствует «aa», «aaa», «aaaa».
Якоря (^, $)
^— соответствует началу строки.$— соответствует концу строки.
Примеры:
^Helloнайдёт «Hello» только в начале строки.world$найдёт «world» только в конце строки.^hello$соответствует строке, которая точно равна «hello».
Символьные классы ([])
Символьные классы позволяют задать набор символов, любой из которых может находиться в данной позиции.
[abc]— соответствует любому символуa,bилиc.[a-z]— соответствует любому символу отaдоz.[^abc]— соответствует любому символу, кромеa,bилиc.
Примеры:
[0-9]соответствует любой цифре.[A-Za-z]соответствует любой букве латинского алфавита.[^0-9]соответствует любому символу, который не является цифрой.
Группы и захваты (())
Круглые скобки используются для группировки частей регулярного выражения и захвата совпадений.
Примеры:
(abc)+соответствует «abc», «abcabc», «abcabcabc».- В строке «John Doe», регулярное выражение
(\w+) (\w+)захватит «John» и «Doe» отдельно.
Альтернация (|)
Символ | позволяет задать альтернативные варианты (логическое «ИЛИ»).
Пример:
cat|dogсоответствует «cat» или «dog».
Обратные ссылки (\1, \2, и т.д.)
Обратные ссылки позволяют ссылаться на ранее захваченные группы.
Пример:
(\\w+) \\1соответствует повторяющемуся слову, например, «hello hello».
Предварительные классы символов
Сокращенные записи
\d— соответствует любой цифре (эквивалентно[0-9]).\D— соответствует любому символу, который не является цифрой.\w— соответствует любому буквенно-цифровому символу и символу подчеркивания (эквивалентно[A-Za-z0-9_]).\W— соответствует любому символу, который не является\w.\s— соответствует любому пробельному символу (пробел, табуляция, новая строка).\S— соответствует любому символу, который не является пробельным.
Примеры:
\d{3}соответствует любой последовательности из трех цифр.\w+соответствует одному или более буквенно-цифровым символам.
Жадные и ленивые квантификаторы
Квантификаторы по умолчанию являются жадными, то есть они стараются захватить максимально возможное количество символов.
- Жадный квантификатор:
.* - Ленивый квантификатор:
.*?
Пример:
- При применении к строке
<div>Content</div>регулярного выражения<.*>, жадный квантификатор.*захватит всю строку<div>Content</div>. - Если использовать ленивый квантификатор
<.*?>, он захватит только<div>.
Просмотр вперед и назад
Положительный и отрицательный просмотр
Просмотр вперед позволяет проверить, что после определенной позиции в строке следует или не следует определенный шаблон, не включая его в результат совпадения.
- Положительный просмотр вперед:
(?=...) - Отрицательный просмотр вперед:
(?!...)
Пример:
\w+(?=\d)— соответствует слову, после которого следует цифра, но цифра не включается в результат.
Просмотр назад проверяет, что перед определенной позицией в строке находится или не находится определенный шаблон.
- Положительный просмотр назад:
(?<=...) - Отрицательный просмотр назад:
(?<!...)
Пример:
(?<=\$)\d+— соответствует числу, перед которым стоит знак$.
Практические примеры применения
Валидация адреса электронной почты
Регулярное выражение:
^[\w.-]+@[\w.-]+\.[A-Za-z]{2,6}$
Объяснение:
^— начало строки.[\w.-]+— один или более буквенно-цифровых символов, точек или дефисов.@— символ «@»[\w.-]+— доменное имя.\.— точка.[A-Za-z]{2,6}— доменное расширение от 2 до 6 букв.$— конец строки.
Пример кода на Python:
import re
email = "example@test.com"
pattern = r"^[\w\.-]+@[\w\.-]+\.[A-Za-z]{2,6}$"
if re.match(pattern, email):
print("Email корректен")
else:
print("Email некорректен")
Поиск IP-адресов в тексте
Регулярное выражение:
\b(?:\d{1,3}\.){3}\d{1,3}\b
Объяснение:
\b— граница слова.(?:\d{1,3}\.){3}— три группы цифр от 1 до 3, заканчивающиеся точкой.\d{1,3}— от 1 до 3 цифр.\b— граница слова.
Пример кода на Python:
import re
text = "Сервер доступен по IP 192.168.0.1, резервный по 10.0.0.254."
pattern = r"\b(?:\d{1,3}\.){3}\d{1,3}\b"
ips = re.findall(pattern, text)
print(ips) # ['192.168.0.1', '10.0.0.254']
Извлечение URL из строки
Регулярное выражение:
https?://[^\s]+
Объяснение:
https?://— соответствует «http://» или «https://».[^\s]+— один или более символов, кроме пробельных.
Пример кода на Python:
import re
text = "Посетите наш сайт по ссылке https://www.example.com или http://example.org."
pattern = r"https?://[^\s]+"
urls = re.findall(pattern, text)
print(urls) # ['https://www.example.com', 'http://example.org']
Замена номеров телефонов на маскированный формат
Исходный текст:
«Контактные номера: +7 (123) 456-78-90, 8-800-555-35-35.»
Регулярное выражение для замены:
(\+7|8)[\s-]?(\(?\d{3}\)?)[\s-]?(\d{3})[\s-]?(\d{2})[\s-]?(\d{2})
Цель замены:
Замаскировать номера телефонов, оставив только последние 4 цифры.
Пример кода на Python:
import re
text = "Контактные номера: +7 (123) 456-78-90, 8-800-555-35-35."
pattern = r"(\+7|8)[\s-]?(\(?\d{3}\)?)[\s-]?(\d{3})[\s-]?(\d{2})[\s-]?(\d{2})"
def mask_phone(match):
return "***-***-" + match.group(4) + "-" + match.group(5)
masked_text = re.sub(pattern, mask_phone, text)
print(masked_text) # Контактные номера: ***-***-78-90, ***-***-35-35.
Удаление HTML-тегов из текста
Регулярное выражение:
<[^>]+>
Объяснение:
<— открывающий символ тега.[^>]+— любой символ, кроме>, один или более раз.>— закрывающий символ тега.
Пример кода на Python:
import re
html = "<p>Это <strong>важный</strong> текст.</p>"
pattern = r"<[^>]+>"
clean_text = re.sub(pattern, "", html)
print(clean_text) # Это важный текст.
Регулярные выражения в различных языках программирования
Python
В Python модуль re предоставляет функции для работы с регулярными выражениями.
Основные функции:
re.match()— ищет совпадение в начале строки.re.search()— ищет совпадение в любом месте строки.re.findall()— возвращает список всех найденных совпадений.re.sub()— заменяет совпадения на заданную строку.
Пример:
import re
pattern = r"\d+"
text = "У меня 2 яблока и 3 банана."
matches = re.findall(pattern, text)
print(matches) # ['2', '3']
JavaScript
В JavaScript регулярные выражения являются встроенными объектами и используются с методами строк или объектами RegExp.
Основные методы:
string.match()string.search()string.replace()string.split()
Пример:
let text = "Hello, world!";
let pattern = /world/;
let result = text.match(pattern);
console.log(result[0]); // 'world'
PHP
В PHP функции для работы с регулярными выражениями начинаются с preg_.
Основные функции:
preg_match()preg_match_all()preg_replace()preg_split()
Пример:
<?php
$text = "The quick brown fox jumps over the lazy dog.";
$pattern = "/\b\w{4}\b/";
preg_match_all($pattern, $text, $matches);
print_r($matches[0]); // Array ( [0] => quick [1] => over [2] => lazy )
?>
Java
В Java пакет java.util.regex предоставляет классы для работы с регулярными выражениями.
Основные классы:
PatternMatcher
Пример:
import java.util.regex.*;
public class RegexExample {
public static void main(String[] args) {
String text = "Email: example@test.com";
String patternString = "\\w+@\\w+\\.\\w+";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
System.out.println("Found email: " + matcher.group());
}
}
}
Советы и рекомендации
- Тестируйте регулярные выражения: Используйте онлайн-инструменты, такие как regex101.com, для тестирования и отладки ваших регулярных выражений.
- Избегайте избыточной сложности: Старайтесь писать регулярные выражения, которые легко понять и поддерживать.
- Документируйте сложные выражения: Добавляйте комментарии или разбивайте выражения на части для лучшей читаемости.
- Будьте осторожны с жадными квантификаторами: Они могут привести к неожиданным результатам. Используйте ленивые квантификаторы, когда это необходимо.
- Экранируйте специальные символы: Если вам нужно использовать метасимвол как обычный символ, экранируйте его с помощью обратного слеша
\.
Заключение
Регулярные выражения — мощный инструмент, который может значительно упростить работу с текстовыми данными. Несмотря на то, что они могут показаться сложными на первый взгляд, с практикой приходит понимание и умение применять их эффективно.
Надеемся, что это руководство помогло вам лучше понять регулярные выражения и вдохновило на их использование в ваших проектах.
Дополнительные ресурсы
- Книги:
- «Мастер регулярных выражений» — Джеффри Фридл
- «Регулярные выражения для начинающих» — Майкл Фицджеральд
- Онлайн-ресурсы:
- RegexOne — интерактивные уроки по регулярным выражениям.
- Regular-Expressions.info — подробное руководство по регулярным выражениям.
- Regex101 — онлайн-тестер регулярных выражений с пояснениями.
Практикуйтесь, экспериментируйте и не бойтесь использовать регулярные выражения в своих проектах!


Комментарии