Регулярні вирази у Java | robot_dreams
Для відстеження статусу замовлення - авторизуйтесь
Введіть код, який був надісланий на пошту Введіть код із SMS, який був надісланий на номер
 
Код дійсний протягом 2 хвилин Код з SMS дійсний протягом 2 хвилин
Ви впевнені, що хочете вийти?
Сеанс завершено
На головну
Регулярні вирази у 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 — будь-який символ, крім буквено-цифрового.

Ви можете встановити діапазон символів за допомогою символу -. Тоді регулярний вираз (az) шукатиме всі символи в діапазоні.

Деякі команди починаються з оберненої скісної риски \. Це означає, що наступний символ використовують як спецсимвол. Наприклад, поєднання косої риси та символу 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. Він підтримує восьму версію мови і здатний інтерпретувати регулярні вирази, протестувати код і скористатися бібліотекою готових рішень.

Ще статті
Експертки про те, як оцінюють кандидатів на нетехнічних інтерв’ю
Частина 2. Робота із записами: вставка, читання, змінення й видалення