Класс Java Pattern

В Java,Patternкласс является одним из основных компонентов функциональности регулярных выражений; он относится кjava.util.regexпакет.

Регулярное выражение — это мощный инструмент обработки текста, используемый для сопоставления, поиска и замены определённых шаблонов в строках.

PatternОсновная функция класса — скомпилировать регулярное выражение в шаблон для последующих эффективных операций сопоставления.


Введение в регулярные выражения

Регулярное выражение — это синтаксис, используемый для описания шаблонов строк. С помощью определённых символов и правил можно определять сложные правила сопоставления строк. Например:

  • \dСоответствует любой цифре (эквивалентно[0-9])
  • \wСоответствует любой букве, цифре или подчёркиванию (эквивалентно[a-zA-Z0-9_])
  • a+Соответствует одной или нескольким последовательным буквамa
  • ^Соответствует началу строки
  • $Соответствует концу строки

Базовое использование класса Pattern

Создание объекта Pattern

PatternУ класса нет открытого конструктора; его нужно создавать через статический методcompile()чтобы создать экземпляр:

Пример

import java.util.regex.Pattern;

// Компилируем регулярное выражение
Pattern pattern = Pattern.compile("a*b");

Общие методы

matcher(CharSequence input)

СоздаётMatcherобъект, используемый для выполнения операций сопоставления над входной строкой:

Пример

Matcher matcher = pattern.matcher("aaaab");

matches(String regex, CharSequence input)

Статический метод, который напрямую определяет, полностью ли входная строка соответствует регулярному выражению:

Пример

boolean isMatch = Pattern.matches("a*b", "aaaab"); // Возвращает true

split(CharSequence input)

Разделяет входную строку в соответствии с регулярным выражением:

Пример

String[] parts = pattern.split("aaaabtest"); // Возвращает ["", "test"]

Флаги регулярных выражений

При компиляции регулярного выражения можно указать различные флаги, изменяющие поведение сопоставления:

Флаг Описание
Pattern.CASE_INSENSITIVE Игнорировать регистр
Pattern.MULTILINE Многострочный режим,^и$соответствует началу и концу каждой строки
Pattern.DOTALL .Соответствует всем символам, включая символы конца строки
Pattern.UNICODE_CASE Включает свёртку регистра с учётом Unicode

Пример использования:

Пример

// Сопоставление без учета регистра
Pattern pattern = Pattern.compile("a*b", Pattern.CASE_INSENSITIVE);

Практические применения класса Pattern

Проверка формата электронной почты

Пример

String emailRegex = "^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$";
Pattern emailPattern = Pattern.compile(emailRegex);

String email = "[email protected]";
boolean isValid = emailPattern.matcher(email).matches();

Извлечение чисел

Пример

String text = "Price: $123.45";
Pattern numberPattern = Pattern.compile("\\d+\\.?\\d*");
Matcher matcher = numberPattern.matcher(text);

if (matcher.find()) {
    String number = matcher.group(); // "123.45"
}

Замена строк

Пример

String input = "Привет, мой телефон 123-456-7890";
Pattern phonePattern = Pattern.compile("\\d{3}-\\d{3}-\\d{4}");
String output = phonePattern.matcher(input).replaceAll("[PHONE]");
// Вывод: "Привет, мой телефон [PHONE]"

Советы по оптимизации производительности

  1. Предварительно компилируйте регулярные выражения: Регулярные выражения, которые нужно использовать несколько раз, следует предварительно компилировать вPatternобъект, а не перекомпилировать их при каждом использовании.

  2. Избегайте слишком сложных регулярных выражений: Слишком сложные регулярные выражения могут привести к снижению производительности или даже к проблемам "катастрофического возврата".

  3. Используйте группы разумно: Незахватывающие группы(?:...)работают лучше, чем захватывающие группы(...)Если вам не нужно захватывать содержимое, используйте незахватывающие группы.


Итог

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() Возвращает строковое представление шаблона
Другие расширения