Регулярные выражения в 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 =