Захватывающие группы
Извлекайте совпавшие подстроки
«Захватывающие группы» — бесплатный урок Java Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
Что такое захватывающие группы
Круглые скобки ( ) в регулярном выражении создают захватывающие группы. После совпадения можно отдельно извлечь текст каждой группы, что особенно удобно при разборе структурированных данных.
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main {
public static void main(String[] args) {
Matcher m = Pattern.compile("(\\d+)-(\\d+)").matcher("42-99");
if (m.find()) {
System.out.println(m.group(1));
System.out.println(m.group(2));
}
}
}Группа 0 — всё совпадение
group(0) (или group()) возвращает весь совпавший текст. Нумерация групп начинается с 1.
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main {
public static void main(String[] args) {
Matcher m = Pattern.compile("(\\d+)px").matcher("width: 24px");
if (m.find()) {
System.out.println(m.group(0));
System.out.println(m.group(1));
}
}
}Подсчёт групп
groupCount() возвращает количество захватывающих групп в шаблоне, не считая группу 0.
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main {
public static void main(String[] args) {
Matcher m = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})").matcher("2026-05-30");
if (m.find()) System.out.println(m.groupCount());
}
}Разбор даты
Захватывающие группы позволяют легко разделить форматированное значение на части.
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main {
public static void main(String[] args) {
Matcher m = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})").matcher("2026-05-30");
if (m.matches()) {
System.out.println("year=" + m.group(1));
System.out.println("month=" + m.group(2));
System.out.println("day=" + m.group(3));
}
}
}Именованные группы
Задайте группе имя с помощью (?<name>...) и извлекайте её по имени. Благодаря этому шаблоны становятся намного понятнее.
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main {
public static void main(String[] args) {
Pattern p = Pattern.compile("(?<user>\\w+)@(?<host>\\w+\\.\\w+)");
Matcher m = p.matcher("alice@example.com");
if (m.find()) {
System.out.println(m.group("user"));
System.out.println(m.group("host"));
}
}
}Границы групп
start(n) и end(n) возвращают диапазон индексов определённой группы во входном значении.
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main {
public static void main(String[] args) {
Matcher m = Pattern.compile("(\\d+)").matcher("abc123");
if (m.find()) {
System.out.println(m.start(1) + " to " + m.end(1));
}
}
}Незахватывающие группы
Используйте (?:...), чтобы объединять элементы для чередования или задания количественных ограничителей без создания нумерованной группы. Так номера групп остаются осмысленными.
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main {
public static void main(String[] args) {
Matcher m = Pattern.compile("(?:Mr|Ms)\\.? (\\w+)").matcher("Ms. Smith");
if (m.find()) System.out.println(m.group(1));
}
}Необязательные группы могут иметь значение null
Если группа необязательна и не участвовала в совпадении, group(n) возвращает null. Всегда обрабатывайте этот случай.
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main {
public static void main(String[] args) {
Matcher m = Pattern.compile("(\\d+)(px)?").matcher("50");
if (m.matches()) {
System.out.println(m.group(1));
System.out.println(m.group(2));
}
}
}Перебор совпадений с группами
Объедините вызов find в цикле с извлечением групп, чтобы получать структурированные токены из более длинного текста.
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main {
public static void main(String[] args) {
Matcher m = Pattern.compile("(\\w+)=(\\d+)").matcher("a=1 b=2 c=3");
while (m.find()) {
System.out.println(m.group(1) + " -> " + m.group(2));
}
}
}Обратные ссылки в шаблоне
Внутри регулярного выражения \1 сопоставляется с тем же текстом, который захватила предыдущая группа. Это позволяет обнаруживать повторения, например удвоенное слово.
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main {
public static void main(String[] args) {
Matcher m = Pattern.compile("(\\w+) \\1").matcher("the the cat");
System.out.println(m.find());
System.out.println(m.group(1));
}
}Сохранение захваченных данных в записи
Удобный шаблон действий: сопоставить, извлечь группы и создать небольшой объект. Здесь мы используем запись.
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main {
record Point(int x, int y) {}
public static void main(String[] args) {
Matcher m = Pattern.compile("\\((\\d+),(\\d+)\\)").matcher("(3,7)");
if (m.matches()) {
Point p = new Point(Integer.parseInt(m.group(1)), Integer.parseInt(m.group(2)));
System.out.println(p);
}
}
}Быстрая проверка
Что возвращает group(0) после успешного совпадения?
Повторение
Вы извлекали подстроки из совпадений:
- Круглые скобки создают нумерованные группы;
group(0)— это всё совпадение, а группы с номерами от 1 и выше — захваченные фрагменты. (?<name>...)создаёт именованные группы, которые извлекаются черезgroup("name").(?:...)объединяет элементы без захвата.- Необязательные группы могут иметь значение
null;\1создаёт обратную ссылку на предыдущую группу.
Часто задаваемые вопросы
Урок «Захватывающие группы» бесплатный?
Да — полный текст урока «Захватывающие группы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «Захватывающие группы»?
Извлекайте совпавшие подстроки Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Захватывающие группы»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Компиляция шаблонов
- Поиск и сопоставление
- Захватывающие группы
- Замена с помощью регулярных выражений