Регулярные выражения в Java с примерами: для начинающих

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

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

Начать курс

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

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

1. Основные классы для работы с regex в Java

В Java для работы с регулярными выражениями используются два основных класса:

  • Pattern — представляет собой скомпилированное регулярное выражение.
  • Matcher — выполняет операции поиска и сопоставления с текстом.

Также существует удобный метод String.matches(), который позволяет быстро проверить, соответствует ли строка шаблону, но он менее гибкий.

Пример 1: Простое совпадение

import java.util.regex.*;

public class RegexExample1 {
    public static void main(String[] args) {
        String text = "Привет, мир! Java — лучший язык.";
        String pattern = "Java";

        Pattern p = Pattern.compile(pattern);
        Matcher m = p.matcher(text);

        if (m.find()) {
            System.out.println("Слово найдено: " + m.group());
        } else {
            System.out.println("Совпадений нет");
        }
    }
}

Вывод: Слово найдено: Java

2. Метасимволы и символьные классы

Регулярные выражения используют специальные символы (метасимволы) для описания шаблонов:

  • . — любой символ (кроме перевода строки)
  • \d — цифра [0-9]
  • \D — не цифра
  • \w — буква, цифра или подчеркивание [a-zA-Z0-9_]
  • \W — не слово
  • \s — пробельный символ
  • \S — не пробельный символ
  • [abc] — один из символов a, b или c
  • [^abc] — любой символ, кроме a, b, c

Пример 2: Поиск цифр в тексте

import java.util.regex.*;

public class RegexExample2 {
    public static void main(String[] args) {
        String text = "Мой номер: 123-456-7890";
        String pattern = "\\d+"; // одна или более цифр

        Pattern p = Pattern.compile(pattern);
        Matcher m = p.matcher(text);

        while (m.find()) {
            System.out.println("Найдено число: " + m.group());
        }
    }
}

Вывод:

Найдено число: 123
Найдено число: 456
Найдено число: 7890

3. Квантификаторы и границы

Квантификаторы указывают, сколько раз должен повторяться элемент шаблона:

  • * — 0 или более раз
  • + — 1 или более раз
  • ? — 0 или 1 раз
  • {n} — ровно n раз
  • {n,} — n или более раз
  • {n,m} — от n до m раз

Границы помогают указать, где должен находиться шаблон:

  • ^ — начало строки
  • $ — конец строки
  • \b — граница слова

Пример 3: Проверка email-адреса

import java.util.regex.*;

public class RegexExample3 {
    public static void main(String[] args) {
        String email = "user@example.com";
        String pattern = "^[\\w.-]+@[\\w.-]+\\.\\w{2,}$";

        boolean isValid = Pattern.matches(pattern, email);
        System.out.println("Email валиден: " + isValid);
    }
}

Вывод: Email валиден: true

4. Группы захвата и замена текста

Группы захвата позволяют извлекать части совпадения. Они обозначаются круглыми скобками (). Класс Matcher также предоставляет методы replaceAll() и replaceFirst() для замены текста.

Пример 4: Извлечение данных из строки

import java.util.regex.*;

public class RegexExample4 {
    public static void main(String[] args) {
        String text = "Дата: 15.03.2024";
        String pattern = "(\\d{2})\\.(\\d{2})\\.(\\d{4})";

        Pattern p = Pattern.compile(pattern);
        Matcher m = p.matcher(text);

        if (m.find()) {
            System.out.println("День: " + m.group(1));
            System.out.println("Месяц: " + m.group(2));
            System.out.println("Год: " + m.group(3));
        }
    }
}

Вывод:

День: 15
Месяц: 03
Год: 2024

Пример 5: Замена текста с использованием групп

import java.util.regex.*;

public class RegexExample5 {
    public static void main(String[] args) {
        String text = "Иван Иванов, Петр Петров";
        String pattern = "(\\w+)\\s(\\w+)";

        Pattern p = Pattern.compile(pattern);
        Matcher m = p.matcher(text);

        String result = m.replaceAll("$2, $1");
        System.out.println("Результат: " + result);
    }
}

Вывод: Результат: Иванов Иван, Петров Петр

5. Практические советы для начинающих