0Pricing
Java Academy · Урок

Компиляция шаблонов

Pattern.compile и Matcher

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

Пара Pattern и Matcher

Регулярные выражения Java находятся в java.util.regex. Объект Pattern представляет скомпилированное регулярное выражение, а Matcher применяет этот шаблон к конкретным входным данным.

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("\\d+");
        Matcher m = p.matcher("abc123");
        System.out.println(m.find());
    }
}

Однократная компиляция и многократное использование

Pattern.compile — относительно затратная операция. Скомпилируйте шаблон один раз и используйте его повторно для множества входных данных, вместо того чтобы компилировать его заново в цикле.

import java.util.regex.Pattern;

public class Main {
    static final Pattern DIGITS = Pattern.compile("\\d+");

    public static void main(String[] args) {
        System.out.println(DIGITS.matcher("a1").find());
        System.out.println(DIGITS.matcher("bb").find());
    }
}

Экранирование обратных косых черт в Java

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

import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Pattern word = Pattern.compile("\\w+");
        System.out.println(word.matcher("hello").matches());
    }
}

Создание средства сопоставления

pattern.matcher(input) связывает шаблон со входной строкой и возвращает новый объект Matcher, отслеживающий позицию.

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("cat");
        Matcher m = p.matcher("the cat sat");
        System.out.println(m.find());
    }
}

Сопоставители хранят состояние

Объект Matcher хранит изменяемое состояние: текущую позицию и последнее совпадение. Создавайте отдельный объект сопоставления для каждого входного значения; не используйте один объект в разных потоках.

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("\\d");
        Matcher m = p.matcher("a1b2");
        System.out.println(m.find());
        System.out.println(m.find());
    }
}

Флаг игнорирования регистра

Передайте флаги вторым аргументом в compile. Pattern.CASE_INSENSITIVE игнорирует регистр букв.

import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
        System.out.println(p.matcher("I love JAVA").find());
    }
}

Объединение флагов

Объединяйте флаги с помощью побитового оператора OR. Здесь мы добавляем MULTILINE, чтобы якоря сопоставлялись в каждой строке.

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("^a", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
        Matcher m = p.matcher("apple\nApricot");
        int count = 0;
        while (m.find()) count++;
        System.out.println(count);
    }
}

Статическое сокращение matches

Pattern.matches(regex, input) — это вспомогательный метод для однократной проверки, который за один вызов компилирует шаблон и выполняет проверку. Это удобно, но при каждом вызове шаблон компилируется заново.

import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        System.out.println(Pattern.matches("\\d{3}", "123"));
        System.out.println(Pattern.matches("\\d{3}", "12"));
    }
}

Разделение с помощью шаблона

Скомпилированный Pattern может разделять строки с помощью split, эффективно используя один и тот же скомпилированный шаблон.

import java.util.Arrays;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Pattern comma = Pattern.compile("\\s*,\\s*");
        String[] parts = comma.split("a, b ,c,  d");
        System.out.println(Arrays.toString(parts));
    }
}

Проверка шаблона

pattern() возвращает исходную строку регулярного выражения, а flags() — активные флаги в виде значения типа int.

import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("[a-z]+", Pattern.CASE_INSENSITIVE);
        System.out.println(p.pattern());
        System.out.println(p.flags());
    }
}

Некорректные шаблоны вызывают исключение

Некорректное регулярное выражение вызывает PatternSyntaxException во время compile, поэтому ошибки можно обнаружить на раннем этапе.

import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

public class Main {
    public static void main(String[] args) {
        try {
            Pattern.compile("[unclosed");
        } catch (PatternSyntaxException e) {
            System.out.println("Invalid regex");
        }
    }
}

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

Почему часто используемое регулярное выражение следует скомпилировать в статическое поле типа Pattern?

Повторение

Вы скомпилировали шаблоны:

  • Pattern.compile создаёт повторно используемый неизменяемый шаблон, безопасный для работы в разных потоках; matcher связывает его со входным значением.
  • Экранируйте обратные косые черты регулярных выражений в исходном коде Java с помощью \\.
  • Флаги, такие как CASE_INSENSITIVE и MULTILINE, объединяются с помощью побитового OR.
  • Объект Matcher хранит состояние, поэтому создавайте отдельный объект для каждого входного значения.

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

Урок «Компиляция шаблонов» бесплатный?

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

Чему я научусь в уроке «Компиляция шаблонов»?

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

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

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

Сколько времени занимает урок «Компиляция шаблонов»?

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

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

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

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

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