У цій серії уроків ми навчимося використовувати java.util.regex API для регулярних виразів. Також вивчимо синтаксис регулярних виразів.
Що таке регулярні вирази.
Регулярні вирази - це спосіб описати набір рядків із загальними характеристиками, які є у кожного рядка в наборі. Регулярні вирази можуть використовуватися для пошуку та керування даними. Ви повинні вивчити спеціальний синтаксис, щоб створювати регулярні вирази, який виходить за межі звичайного синтаксису мови Java. Регулярні вирази можуть бути різної складності, але як тільки ви зрозумієте основи, ви зможете створювати будь-які регулярні вирази. У цих уроках ми розглянемо синтаксис регулярних виразів, а також приклади програм, що працюють з java.util.regex API , щоб зрозуміти, як усе це працює.Як регулярні вирази представлені Java?
Пакет java.util.regex містить три основні класиPattern
, Matcher
, і PatternSyntaxException
.
-
Об'єкт
Pattern
— це регулярне скомпілювання вираз.Pattern
не надає громадських конструкторів. Щоб створити,pattern
необхідно викликатиpublic static compile
метод, який поверне об'єктPattern
. Перший аргумент цієї функції – регулярне вираження. -
Об'єкт
Matcher
- це "движок", який інтерпретує регулярне вираження і зіставляє його з вхідним рядком. Як і класPattern
,Matcher
немає публічних конструкторів. Отримати об'єктMatcher
можна викликавши методmatcher
об'єктаPattern
. -
PatternSyntaxException
- Виняток, що означає синтаксичну помилку у виразі. -
Згодом ми докладно розглянемо кожен із цих класів. Але спочатку необхідно розуміти, як влаштовані регулярні вирази. Розглянемо тестову програму розуміння синтаксису регулярних выражений.
RegexTestHarness.java
для вивчення регулярних виразів. Команда для запуску програми: java RegexTestHarness
можна без аргументів. Цикл програми повторюється, дозволяючи користувача вводити регулярний вираз та рядок для пошуку. Ви можете не використовувати цю програму, однак вона може бути корисною для тестування прикладів, які ми будемо розглядати.
Рядкові літерали
Основним завданням шаблонів є порівняння рядків. Наприклад, якщо регулярне виразfoo
і вхідний рядок foo
, то програма знайде збіг, тому що рядки однакові. Спробуйте цей приклад у нашій тестовій програмі.
Enter your regex: foo
Enter input string to search: foo
I found the text foo starting at index 0 and ending at index 3.
Зверніть увагу, що довжина вхідного рядка дорівнює 3, початковий індекс 0, кінцевий 3: Кожен символ рядка розташований у своєму осередку з індексами, що вказують між осередків. Рядок foo починається на індексі 0 і закінчується на 3, незважаючи на те, що займає комірки 0, 1, 2. У наступному прикладі ви помітите деякі особливості: наступний збіг починається там, де закінчується попереднє:
Метасимволи
Дане API також підтримує деякі спеціальні символи, які визначають «поведінку» регулярного виразу. Спробуємо змінити вхідний рядок наcats
, а регулярний вираз на cat.
. Висновок:
Enter your regex: cat.
Enter input string to search: cats
I found the text cats starting at index 0 and ending at index 4.
Порівняння, як і раніше, успішне, навіть незважаючи на точку у вхідному рядку. Так сталося, тому що точка – метасимвол – спеціальний символ, який має якесь значення для matcher
'а. Метасимвол точка має сенс «будь-який символ», тому порівняння виявилося успішним у цьому прикладі. Метасимволи, що підтримуються API: <([{\^-=$!|]})?*+.>
Існує два способи позначити метасимволи, щоб вони сприймалися як звичайні:
- екранувати метасимвол зворотним слешем
- укласти в
\Q
(початок) та\E
(кінець).
\Q
і \E
в будь-яке місце вираження, \Q
необхідно розташовувати перед \E
. На цьому все, у наступних уроках, ми продовжимо вивчення регулярних виразів у Java. Посилання на першоджерело: Регулярні вирази Java. Частина 1
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ