Класс Java Pattern
В Java,Patternкласс является одним из основных компонентов функциональности регулярных выражений; он относится кjava.util.regexпакет.
Регулярное выражение — это мощный инструмент обработки текста, используемый для сопоставления, поиска и замены определённых шаблонов в строках.
PatternОсновная функция класса — скомпилировать регулярное выражение в шаблон для последующих эффективных операций сопоставления.
Введение в регулярные выражения
Регулярное выражение — это синтаксис, используемый для описания шаблонов строк. С помощью определённых символов и правил можно определять сложные правила сопоставления строк. Например:
\dСоответствует любой цифре (эквивалентно[0-9])\wСоответствует любой букве, цифре или подчёркиванию (эквивалентно[a-zA-Z0-9_])a+Соответствует одной или нескольким последовательным буквамa^Соответствует началу строки$Соответствует концу строки
Базовое использование класса Pattern
Создание объекта Pattern
PatternУ класса нет открытого конструктора; его нужно создавать через статический методcompile()чтобы создать экземпляр:
Пример
// Компилируем регулярное выражение
Pattern pattern = Pattern.compile("a*b");
Общие методы
matcher(CharSequence input)
СоздаётMatcherобъект, используемый для выполнения операций сопоставления над входной строкой:
Пример
matches(String regex, CharSequence input)
Статический метод, который напрямую определяет, полностью ли входная строка соответствует регулярному выражению:
Пример
split(CharSequence input)
Разделяет входную строку в соответствии с регулярным выражением:
Пример
Флаги регулярных выражений
При компиляции регулярного выражения можно указать различные флаги, изменяющие поведение сопоставления:
| Флаг | Описание |
|---|---|
Pattern.CASE_INSENSITIVE |
Игнорировать регистр |
Pattern.MULTILINE |
Многострочный режим,^и$соответствует началу и концу каждой строки |
Pattern.DOTALL |
.Соответствует всем символам, включая символы конца строки |
Pattern.UNICODE_CASE |
Включает свёртку регистра с учётом Unicode |
Пример использования:
Пример
Pattern pattern = Pattern.compile("a*b", Pattern.CASE_INSENSITIVE);
Практические применения класса Pattern
Проверка формата электронной почты
Пример
Pattern emailPattern = Pattern.compile(emailRegex);
String email = "[email protected]";
boolean isValid = emailPattern.matcher(email).matches();
Извлечение чисел
Пример
Pattern numberPattern = Pattern.compile("\\d+\\.?\\d*");
Matcher matcher = numberPattern.matcher(text);
if (matcher.find()) {
String number = matcher.group(); // "123.45"
}
Замена строк
Пример
Pattern phonePattern = Pattern.compile("\\d{3}-\\d{3}-\\d{4}");
String output = phonePattern.matcher(input).replaceAll("[PHONE]");
// Вывод: "Привет, мой телефон [PHONE]"
Советы по оптимизации производительности
Предварительно компилируйте регулярные выражения: Регулярные выражения, которые нужно использовать несколько раз, следует предварительно компилировать в
Patternобъект, а не перекомпилировать их при каждом использовании.Избегайте слишком сложных регулярных выражений: Слишком сложные регулярные выражения могут привести к снижению производительности или даже к проблемам "катастрофического возврата".
Используйте группы разумно: Незахватывающие группы
(?:...)работают лучше, чем захватывающие группы(...)Если вам не нужно захватывать содержимое, используйте незахватывающие группы.
Итог
PatternКласс является ядром функциональности регулярных выражений Java, предоставляя мощные возможности сопоставления строк с шаблонами. Благодаря правильному использованиюPatternкласса и его сопутствующегоMatcherкласса можно эффективно выполнять различные задачи обработки строк. Освоение регулярных выражений иPatternиспользование класса значительно расширит возможности разработчиков по обработке текста.
В следующей таблице перечисленыPatternчасто используемые методы класса:
Методы создания и компиляции
| Метод | Описание |
|---|---|
static Pattern compile(String regex) |
Компилирует регулярное выражение в объект Pattern |
static Pattern compile(String regex, int flags) |
Компилирует регулярное выражение с указанными флагами |
static boolean matches(String regex, CharSequence input) |
Быстро сопоставляет регулярное выражение (компиляция + сопоставление) |
static String quote(String s) |
Преобразует строку в литеральный шаблон (экранирует все специальные символы) |
Константы флагов (распространённые)
| Флаг | Описание |
|---|---|
Pattern.CASE_INSENSITIVE |
Сопоставление без учёта регистра |
Pattern.MULTILINE |
Многострочный режим (^ и $ соответствуют началу и концу строк) |
Pattern.DOTALL |
Точка (.) соответствует всем символам, включая символы конца строки |
Pattern.UNICODE_CASE |
Включает свёртку регистра с учётом Unicode |
Методы сопоставления и разделения
| Метод | Описание |
|---|---|
Matcher matcher(CharSequence input) |
Создаёт объект matcher |
String[] split(CharSequence input) |
Разделяет входную строку с помощью шаблона |
String[] split(CharSequence input, int limit) |
Разделение с ограничением |
Stream<String> splitAsStream(CharSequence input) |
Возвращает поток результатов разделения (Java 8+) |
Методы информации о шаблоне
| Метод | Описание |
|---|---|
String pattern() |
Возвращает скомпилированное регулярное выражение |
int flags() |
Возвращает флаги, установленные во время компиляции |
String toString() |
Возвращает строковое представление шаблона |