Компиляция шаблонов
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 — локальная установка не требуется.