0Pricing
Java Academy · Урок

Регулярные выражения с Pattern и Matcher

Проверяйте адреса электронной почты, извлекайте подстроки и заменяйте шаблоны с помощью регулярных выражений Java.

«Регулярные выражения с Pattern и Matcher» — бесплатный урок Java Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.

Регулярные выражения с Pattern и Matcher

Пакет Java java.util.regex предоставляет Pattern и Matcher для мощного поиска по тексту, проверки, извлечения и замены.

Зачем нужны регулярные выражения

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

import java.util.regex.*;

// Is this a valid email?
String email = "alice@example.com";
boolean valid = email.matches("[a-zA-Z0-9._%+\\-]+@[a-zA-Z0-9.\\-]+\\.[a-zA-Z]{2,}");
System.out.println(valid); // true

// Extract version numbers from a string
String log = "App v1.2.3 deployed; api v2.0.0 started";
Pattern p = Pattern.compile("v(\\d+\\.\\d+\\.\\d+)");
Matcher m = p.matcher(log);
while (m.find()) System.out.println(m.group(1));
// 1.2.3 
// 2.0.0

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

Основные метасимволы регулярных выражений:

  • . — любой символ
  • \d — цифра; \w — символ слова; \s — пробельный символ
  • * — 0 и более раз; + — 1 и более раз; ? — 0 или 1 раз
  • {n,m} — от n до m раз
  • ^/$ — начало/конец строки
  • [abc] — класс символов
// In Java strings, backslash must be doubled: \d = "\\d"
Pattern digit   = Pattern.compile("\\d+");      // one or more digits
Pattern word    = Pattern.compile("\\w{3,20}");  // 3-20 word chars
Pattern space   = Pattern.compile("\\s+");       // whitespace
Pattern phone   = Pattern.compile("\\d{3}-\\d{3}-\\d{4}"); // 555-867-5309

System.out.println(digit.matcher("42").matches());       // true
System.out.println(phone.matcher("555-867-5309").matches()); // true

Pattern.compile и Matcher

Скомпилируйте шаблон один раз и повторно используйте Matcher для нескольких входных данных — это эффективнее, чем применять String.matches() при многократной проверке.

import java.util.regex.*;

Pattern emailPattern = Pattern.compile(
    "^[a-zA-Z0-9._%+\\-]+@[a-zA-Z0-9.\\-]+\\.[a-zA-Z]{2,6}$"
);

String[] emails = {"alice@example.com", "bad@", "test.user@co.uk", "no-at-sign"};
for (String e : emails) {
    Matcher m = emailPattern.matcher(e);
    System.out.println(e + " -> " + (m.matches() ? "valid" : "invalid"));
}

find() и matches()

matches() проверяет всю строку. find() находит следующее вхождение внутри строки. Используйте find для поиска, а matches — для полной проверки.

import java.util.regex.*;

Pattern price = Pattern.compile("\\d+\\.\\d{2}");

String invoice = "Total: 129.99, Tax: 10.40, Shipping: 5.00";
Matcher m = invoice.matcher(invoice);

// find() locates all matches
while (m.find()) {
    System.out.println("Found: " + m.group() + " at " + m.start());
}
// Found: 129.99 at 7
// Found: 10.40 at 20
// Found: 5.00 at 34

Группы захвата

Круглые скобки создают группы захвата. Используйте group(n), чтобы извлекать совпавшие подстроки.

import java.util.regex.*;

Pattern date = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})");
Matcher m = date.matcher("Deployed on 2024-06-15 and 2024-07-01");

while (m.find()) {
    String year  = m.group(1);
    String month = m.group(2);
    String day   = m.group(3);
    System.out.println(year + "/" + month + "/" + day);
}
// 2024/06/15
// 2024/07/01

Именованные группы

Именованные группы (?<name>...) делают группы захвата более понятными и позволяют обращаться к ним по имени.

import java.util.regex.*;

Pattern log = Pattern.compile(
    "(?<timestamp>\\d{4}-\\d{2}-\\d{2}) (?<level>[A-Z]+) (?<message>.+)"
);

String line = "2024-06-15 ERROR Database connection failed";
Matcher m = log.matcher(line);

if (m.matches()) {
    System.out.println("Time: "    + m.group("timestamp"));
    System.out.println("Level: "   + m.group("level"));
    System.out.println("Message: " + m.group("message"));
}
// Time: 2024-06-15
// Level: ERROR
// Message: Database connection failed

replaceAll и replaceFirst

Замена по шаблону: заменить все вхождения или только первое.

import java.util.regex.*;

String text = "Call us at 123-456-7890 or 098-765-4321";

// Mask phone numbers for privacy logs
String masked = text.replaceAll("\\d{3}-\\d{3}-\\d{4}", "XXX-XXX-XXXX");
System.out.println(masked);
// Call us at XXX-XXX-XXXX or XXX-XXX-XXXX

// Replace multiple whitespace with single space
String cleaned = "too   many   spaces".replaceAll("\\s+", " ");
System.out.println(cleaned); // too many spaces

split() с регулярными выражениями

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

// Split on comma with optional spaces
String csv = "Alice, Bob,  Charlie,Diana";
String[] names = csv.split("\\s*,\\s*");
for (String name : names) System.out.println("'" + name + "'");
// 'Alice' 'Bob' 'Charlie' 'Diana'

// Split on any whitespace
String words = "one  two\tthree  four";
String[] parts = words.split("\\s+");
System.out.println(parts.length); // 4

// Limit splits
String line = "key=value=extra";
String[] kv = line.split("=", 2); // [key, value=extra]

Флаги Pattern

Флаги изменяют поведение регулярных выражений: CASE_INSENSITIVE, MULTILINE, DOTALL.

import java.util.regex.*;

// Case-insensitive match
Pattern p = Pattern.compile("hello", Pattern.CASE_INSENSITIVE);
System.out.println(p.matcher("HELLO World").find()); // true

// MULTILINE: ^ and $ match line boundaries
Pattern multi = Pattern.compile("^ERROR", Pattern.MULTILINE);
String logs = "INFO start\nERROR crash\nINFO end";
Matcher m = multi.matcher(logs);
int count = 0;
while (m.find()) count++;
System.out.println("ERROR lines: " + count); // 1

Практический пример: анализатор журналов

Разбор строк журнала доступа в стиле Apache с помощью именованных групп.

import java.util.regex.*;

Pattern accessLog = Pattern.compile(
    "(?<ip>[\\d.]+) - - \\[(?<time>[^\\]]+)\\] " +
    "\"(?<method>[A-Z]+) (?<path>[^ ]+)[^\"]*\" " +
    "(?<status>\\d{3}) (?<bytes>\\d+)"
);

String line = "192.168.1.1 - - [27/May/2024:10:30:00 +0000] \"GET /api/products HTTP/1.1\" 200 1024";
Matcher m = accessLog.matcher(line);
if (m.matches()) {
    System.out.println("IP: "     + m.group("ip"));
    System.out.println("Method: " + m.group("method"));
    System.out.println("Status: " + m.group("status"));
}

Быстрая проверка

В чём разница между matches() и find() в Matcher?

Итоги: регулярные выражения с Pattern и Matcher

Главные выводы:

  • Pattern.compile() компилирует регулярное выражение; Matcher проверяет его по строкам
  • matches() проверяет всю строку; find() ищет вхождения
  • Группы захвата () извлекают подстроки; доступ к ним осуществляется через group(n) или group("name")
  • Именованные группы (?<name>...) делают шаблоны более понятными
  • replaceAll() и split() принимают шаблоны регулярных выражений для гибкой обработки текста
  • Используйте флаги Pattern.CASE_INSENSITIVE, MULTILINE, DOTALL, чтобы изменять поведение поиска

Часто задаваемые вопросы

Урок «Регулярные выражения с Pattern и Matcher» бесплатный?

Да — полный текст урока «Регулярные выражения с Pattern и Matcher» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.

Чему я научусь в уроке «Регулярные выражения с Pattern и Matcher»?

Проверяйте адреса электронной почты, извлекайте подстроки и заменяйте шаблоны с помощью регулярных выражений Java. Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Java Academy?

Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Регулярные выражения с Pattern и Matcher»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Java Academy?

Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Неизменяемость String и пул строк
  2. StringBuilder для эффективного объединения
  3. Текстовые блоки и String.format
  4. Регулярные выражения с Pattern и Matcher
← Назад к Java Academy