Регулярные выражения в 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. Практические советы для начинающих
- Экранирование: В Java строки с регулярками требуют двойного экранирования. Например,
\\dвместо\d. - Флаги: Используйте флаги для изменения поведения, например
Pattern.CASE_INSENSITIVEдля регистронезависимого поиска. - Тестируйте: Используйте онлайн-тестеры regex (например, regex101.com) перед написанием кода.
- Начинайте с простого: Сначала проверяйте простые шаблоны, затем усложняйте.
Блоги
Рекомендаций по книгам
Читайте также
Docker и PHP: контейнеризация приложений — полное руководство