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

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Регулярные выражения в Java с примерами

Регулярные выражения (regex) — это мощный инструмент для поиска, извлечения и замены текста по шаблону. В Java работа с регулярными выражениями реализована через пакет java.util.regex, который включает два основных класса: Pattern (шаблон) и Matcher (сопоставитель). В этой статье мы разберём синтаксис регулярных выражений, методы работы с ними и приведём практические примеры на Java.

1. Основы синтаксиса регулярных выражений

Регулярное выражение задаёт шаблон для поиска строк. Вот базовые конструкции:

  • . — любой символ (кроме перевода строки).
  • \d — цифра (0-9).
  • \w — буква, цифра или подчёркивание (латиница).
  • \s — пробельный символ (пробел, табуляция, перевод строки).
  • [abc] — один из символов a, b или c.
  • [^abc] — любой символ, кроме a, b, c.
  • * — ноль или более повторений.
  • + — одно или более повторений.
  • ? — ноль или одно повторение.
  • {n,m} — от n до m повторений.
  • ^ — начало строки.
  • $ — конец строки.
  • | — логическое ИЛИ.
  • () — группа захвата.

Экранирование в Java: в строковых литералах Java обратная косая черта \ является управляющим символом. Чтобы передать в regex например \d, нужно написать "\\d". Для точки — "\\.".

2. Классы Pattern и Matcher

Работа с регулярными выражениями в Java начинается с компиляции шаблона:

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class RegexExample {
    public static void main(String[] args) {
        // Компилируем шаблон
        Pattern pattern = Pattern.compile("\\d+");
        // Создаём Matcher для строки
        Matcher matcher = pattern.matcher("Цена: 150 рублей, скидка 20%");
        
        // Поиск всех совпадений
        while (matcher.find()) {
            System.out.println("Найдено: " + matcher.group());
        }
    }
}

Вывод:

Найдено: 150
Найдено: 20

Основные методы Matcher:

  • find() — ищет следующее совпадение (можно вызывать несколько раз).
  • matches() — проверяет, соответствует ли вся строка шаблону (требует полного совпадения).
  • lookingAt() — проверяет, начинается ли строка с шаблона.
  • group() — возвращает найденную подстроку (или конкретную группу).
  • groupCount() — количество групп захвата.

3. Практические примеры

3.1. Валидация email-адреса

Проверим, является ли строка корректным email (упрощённая версия):

public class EmailValidator {
    public static boolean isValidEmail(String email) {
        String regex = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(email);
        return matcher.matches();
    }

    public static void main(String[] args) {
        System.out.println(isValidEmail("test@example.com")); // true
        System.out.println(isValidEmail("invalid-email"));    // false
    }
}

Объяснение шаблона:

  • ^[a-zA-Z0-9._%+-]+ — локальная часть (буквы, цифры, точки, подчёркивания и т.д.).
  • @ — символ @.
  • [a-zA-Z0-9.-]+ — домен (буквы, цифры, точки, дефисы).
  • \\.[a-zA-Z]{2,}$ — точка и домен верхнего уровня (не менее 2 символов).

3.2. Извлечение номеров телефонов

Допустим, у нас есть текст с номерами в формате +7 (999) 123-45-67 или 8-999-123-45-67:

public class PhoneExtractor {
    public static void main(String[] args) {
        String text = "Контакты: +7 (999) 123-45-67 и 8-999-123-45-67";
        String regex = "(\\+7|8)[\\s-]?\\(?\\d{3}\\)?[\\s-]?\\d{3}[\\s-]?\\d{2}[\\s-]?\\d{2}";
        
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(text);
        
        while (matcher.find()) {
            System.out.println("Телефон: " + matcher.group());
        }
    }
}

Вывод:

Телефон: +7 (999) 123-45-67
Телефон: 8-999-123-45-67

3.3. Замена текста с помощью replaceAll

Метод String.replaceAll() использует регулярное выражение для замены:

public class ReplaceExample {
    public static void main(String[] args) {
        String text = "Java 8, Java 11, Java 17";
        // Заменяем "Java X" на "Java 21"
        String result = text.replaceAll("Java \\d+", "Java 21");
        System.out.println(result); // Java 21, Java 21, Java 21
        
        // Удаляем все пробелы
        String noSpaces = text.replaceAll("\\s+", "");
        System.out.println(noSpaces); // Java8,Java11,Java17
    }
}

3.4. Разделение строки с помощью split

Метод split() разбивает строку по регулярному выражению:

public class SplitExample {
    public static void main(String[] args) {
        String data =                

Блоги

Рекомендаций по книгам