0Pricing
Java Academy · Урок

Захватывающие группы

Извлекайте совпавшие подстроки

«Захватывающие группы» — бесплатный урок 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 — локальная установка не требуется.

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

  1. Компиляция шаблонов
  2. Поиск и сопоставление
  3. Захватывающие группы
  4. Замена с помощью регулярных выражений
← Назад к Java Academy