Image

Регулярные выражения: Полное руководство с примерами

Введение

Регулярные выражения (или RegEx) — это мощный инструмент для поиска, обработки и манипулирования текстовыми данными. Они используются во многих языках программирования и текстовых редакторах для решения разнообразных задач, связанных с анализом и преобразованием строк.

В этом руководстве мы подробно рассмотрим, что такое регулярные выражения, как они работают, и приведем множество примеров их практического применения.


Содержание

  1. Что такое регулярные выражения?
  2. Основные концепции
    • Литералы
    • Метасимволы
  3. Специальные символы и их значения
    • Точки (.)
    • Квантификаторы (*, +, ?, {n,m})
    • Якоря (^, $)
    • Символьные классы ([])
    • Группы и захваты (())
    • Альтернация (|)
    • Обратные ссылки (\1, \2, и т.д.)
  4. Предварительные классы символов
    • Сокращенные записи
  5. Жадные и ленивые квантификаторы
  6. Просмотр вперед и назад
    • Положительный и отрицательный просмотр
  7. Практические примеры применения
    • Валидация адреса электронной почты
    • Поиск IP-адресов в тексте
    • Извлечение URL из строки
    • Замена номеров телефонов на маскированный формат
    • Удаление HTML-тегов из текста
  8. Регулярные выражения в различных языках программирования
    • Python
    • JavaScript
    • PHP
    • Java
  9. Советы и рекомендации
  10. Заключение
  11. Дополнительные ресурсы

Что такое регулярные выражения?

Регулярное выражение — это последовательность символов, определяющая шаблон поиска в тексте. Этот шаблон может использоваться для проверки соответствия строк, поиска, замены или разбиения текста.

Регулярные выражения широко применяются для:

  • Валидации вводимых данных (например, проверка правильности адреса электронной почты).
  • Поиска и замены текста в файлах.
  • Извлечения определенных данных из больших текстовых массивов.
  • Обработки логов и анализа данных.

Основные концепции

Литералы

Самый простой тип регулярного выражения — это последовательность литералов. Например, регулярное выражение 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 повторениям.

Примеры:

  1. ca*t соответствует «ct», «cat», «caaat».
  2. ca+t соответствует «cat», «caaat», но не «ct».
  3. ca?t соответствует «ct» и «cat», но не «caaat».
  4. a{3} соответствует «aaa».
  5. a{2,4} соответствует «aa», «aaa», «aaaa».

Якоря (^, $)

  • ^ — соответствует началу строки.
  • $ — соответствует концу строки.

Примеры:

  1. ^Hello найдёт «Hello» только в начале строки.
  2. world$ найдёт «world» только в конце строки.
  3. ^hello$ соответствует строке, которая точно равна «hello».

Символьные классы ([])

Символьные классы позволяют задать набор символов, любой из которых может находиться в данной позиции.

  • [abc] — соответствует любому символу a, b или c.
  • [a-z] — соответствует любому символу от a до z.
  • [^abc] — соответствует любому символу, кроме a, b или c.

Примеры:

  1. [0-9] соответствует любой цифре.
  2. [A-Za-z] соответствует любой букве латинского алфавита.
  3. [^0-9] соответствует любому символу, который не является цифрой.

Группы и захваты (())

Круглые скобки используются для группировки частей регулярного выражения и захвата совпадений.

Примеры:

  1. (abc)+ соответствует «abc», «abcabc», «abcabcabc».
  2. В строке «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 — соответствует любому символу, который не является пробельным.

Примеры:

  1. \d{3} соответствует любой последовательности из трех цифр.
  2. \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 предоставляет классы для работы с регулярными выражениями.

Основные классы:

  • Pattern
  • Matcher

Пример:

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 — онлайн-тестер регулярных выражений с пояснениями.

Практикуйтесь, экспериментируйте и не бойтесь использовать регулярные выражения в своих проектах!

Комментарии