Регулярные выражения в Java

Регулярные выражения в Java

Что нужно знать.

Концепция регулярных выражений возникла еще в 1950-х. Это способ поиска информации в строках с помощью шаблонов, записанных спецсимволами.

Технологию впервые использовал разработчик систем Unix Кен Томпсон в текстовом редакторе ed в 1968 году.

Java часто применяют для работы с регулярными выражениями: их поддержка — часть стандартной библиотеки java.util.regex.

Разобрались, что такое регулярные выражения в Java и как они помогают обрабатывать большие массивы строчных данных.

Что такое регулярные выражения

Для простых операций по обработке текстовой информации в языке Java можно использовать маски имен файлов. Таким способом легко скопировать все файлы, которые начинаются с буквы R.

Регулярные выражения — более продвинутый способ поиска соответствий или ошибок в тексте. Это набор символов (шаблон), который ищет соответствия в файле. Их часто применяют для обработки текста или редактирования, а также в создании скриптов для проверки на валидность. Например, чтобы проверить, отвечает ли заданный пароль условиям сервиса.

Классы библиотеки регулярных выражений

Пакет java.util.regex состоит из набора классов, которые применяют для согласования последовательностей символов с шаблонами, заданных выражениями.

Есть три ключевых класса:

  • Pattern — набор команд и точка доступа к API регулярных выражений на Java.
  • Matcher — класс, который сопоставляет результаты расшифровки класса Pattern с остальной частью программы.

Основные методы Matcher:

  • 1. boolean matches выдает значение true, когда строка соответствует шаблону (Pattern);
  • 2. boolean find выдает значение true, когда в строке есть подстрока, которая соответствует шаблону;
  • 3. string group выдает подстроку, которая совпала с шаблоном после вызова метода find;
  • 4. string replaceAll(String str) меняет все строки, соответствующие шаблону, и выдает результат с изменениями.
  • PatternSyntaxException срабатывает в случае исключений (синтаксических ошибок).

Класс Pattern используют для задания регулярного выражения, а Matcher находит в коде последовательности символов.

Синтаксис регулярных выражений Java

Регулярные выражения записывают с помощью обычных символов, наборов символов и групповых символов.

Проще всего — поиск обычных текстовых символов. Символы, которые обозначают сами себя, называют литералами. Например, если в шаблон задать слово dog, то он будет искать в строке все случаи, когда слова начинаются с этих символов. Например, слова dog и doghunter попадут в выдачу.

Квадратные скобки и циркумфлекс (^) отображают не собственный символ, а команду. Такие символы называют метасимволами или спецсимволами. Если разместить символ ^ в квадратных скобках ( [^dog] ), то matcher будет искать все символы, кроме буквосочетания dog.

Метасимволы для поиска соответствий и границ строк

  • ^ — начало строки;
  • $ — конец строки;
  • - — задать один символ, которого не должно быть в скобках;
  • \b — конец слова;
  • \B — не конец слова;
  • \A — начало ввода;
  • \Z — конец ввода.

Классы символов

Регулярные выражения позволяют работать с классами символов. Например:

  • \d — любой цифровой символ;
  • \D — любой нецифровой;
  • \s — символ пробела;
  • \S — непробельный символ;
  • . — задать один произвольный символ;
  • \w — буквенно-цифровой символ;
  • \W — любой символ, кроме буквенно-цифрового.

Задать диапазон символов можно с помощью символа -. Тогда регулярное выражение (a-z) будет искать все символы в диапазоне.

Некоторые команды начинаются с обратной косой черты \. Это значит, что следующий символ используют как спецсимвол. Например, сочетание косой черты и символа n — \n — будет означать перенос строки.

Иногда нужно экранировать символы, то есть вывести на экран знаки, которые программа обычно воспринимает как системные. Так, знак + обозначает появление другого символа один и более раз. Чтобы отобразить на экране сам плюс, нужно использовать две косые черты: \\+, так как одинарная косая черта \ тоже является спецсимволом.

Квантификаторы и режимы их работы

В регулярных выражениях есть ограничители, которые определяют частоту появления символа или их группы. Такие ограничители называют квантификаторами. Записывают их после символа или группы символов.

Основные квантификаторы:

  • ? — символ появляется ноль или один раз;
  • * — ноль или более раз;
  • + — один или более раз;
  • {n} — n раз;
  • {n,} — n и более;
  • {n,m} — не меньше n, но не более m раз.

Квантификаторы работают в трех режимах: жадном, ленивом и сверхжадном. По умолчанию регулярные выражения работают в жадном режиме.

  • В жадном режиме программа ищет максимальные совпадения по длине строки.
  • Жадный режим выполняет поиск по строке слева направо, а потом наоборот. Сверхжадный не возвращается назад.
  • Отличие сверхжадного режима от жадного — в реверсивном поиске.
  • Ленивый режим ищет наиболее короткое совпадение, которое выполняет все условия шаблона.

Как используют regex в Java

Мы рассказывали, что регулярные выражения применяют для редактуры строк на основе шаблонов. Например, можно автоматически заменить кавычки-лапки “ ” на кавычки-елочки « », проверить правильное написание слов или количество открытых и закрытых скобок.

Также регулярные выражения используют для валидации. Например, чтобы проверить, отвечает ли IP-адрес десятичному виду, содержит ли электронный адрес символ @ и доменное имя.

Символы в регулярных выражениях комбинируются. Java regex для определения валидности телефонного номера выглядит так:

^\\(?(\\d{3}\\)?[- ]?(\\d{3})[- ]?(\\d{4})$

Здесь указаны следующее команды:

  • Номер может начинаться с необязательного знака « ( »;
  • Далее следуют 3 цифры от 0 до 9;
  • Строка может иметь необязательный символ « - » между цифрами;
  • В строке может быть еще один необязательный символ « - »;
  • Еще один диапазон из 3 цифр от 0 до 9;
  • Необязательный символ « - »
  • Еще 4 цифры от 0 до 9.

Такие выражения сложно интерпретировать, но они упрощают выполнение программ и не требуют прописывать многострочный код с большим количеством условий.

Чтобы упростить работу, существуют статистические анализаторы регулярных выражений.

С Java работает онлайн-анализатор Regex101. Он поддерживает восьмую версию языка и способен интерпретировать регулярные выражения, протестировать код и воспользоваться библиотекой готовых решений.

Ещё статьи
Как упростить разработку.
Data science, web development, gamedev и не только.