Назад Зміст Вперед

2.2 Основи технології регулярних виразів. Класи Pattern, Matcher, Scanner.

В програмуванні, регулярний вираз (від англ. regular expression, скорочено regex або regexp, а іноді ще й називають rational expression) — це рядок, що описує або збігається з множиною рядків, відповідно до набору спеціальних синтаксичних правил. Вони використовуються в багатьох текстових редакторах та допоміжних інструментах для пошуку та зміни тексту на основі заданих шаблонів. Багато мов програмування підтримують регулярні вирази для роботи з рядками.

Регулярні вирази (regular expressions) – сучасна система пошуку текстових фрагментів у електронних документах, що заснована на спеціальній системи запису зразків для пошуку.
Регулярні вирази стали проривом в електронному обробленні текстів наприкінці XX століття. На даний час два основних діалекти (POSIX і Perl- сумісних) регулярних виразів є важливою складовою текстових редакторів, інструментів пошуку і більшості мов програмування, таких як C, C++, Delphi, Perl, PHP, Javascript, Python, Ruby, C# і т.п. 
Починаючи з четвертої версії Java підтримка POSIX і Perl-сумісних регулярних виразів забезпечується за допомогою пакета java.util.regex. 
За своєю суттю регулярні вирази – міцна і дуже гнучка мова описів для пошуку за шаблоном. За допомогою регулярних виразів можливо зручно: 
- перевіряти, чи відповідає цілий рядок заданому шаблону; 
- знаходити в рядку підрядки, що задовольняють заданому шаблону; 
- витягувати з рядка підрядки, що відповідають заданому шаблону; 
- змінювати в рядку підрядки, що відповідають шаблону.

У пакеті java.util.regex підтримується обробка регулярних виразів. Регулярний вираз позначає рядок, що описує послідовність символів. Такий опис називається шаблоном і може бути згодом використано для пошуку збігів в інших послідовностях символів. У регулярних виразах допускається визначати метасимволи, набори символів і різні квантори. Таким чином, можна задати регулярний вираз, що представляє загальну форму, збігається з різними конкретними послідовностями символів. Обробка регулярних виразів підтримується двома класами: Pattern і Matcher. Ці класи діють спільно. Регулярний вираз визначається в класі Pattern, а зіставлення послідовності символів з шаблоном здійснюється засобами класу Matcher. 

Клас Pattern

У класі Pattern конструктори не визначаються. Замість цього для складання
шаблону викликається фабричний метод compile (). Нижче наведена одна з
загальних форм цього методу.
static Pattern compile ( Strinq шаблон)
Тут параметр шаблон позначає регулярний вираз, який потрібно використовувати. Метод compile () перетворює в шаблон символьний рядок, який визначається
параметром шаблон , для зіставлення засобами класу MatcherЦей метод повертає об'єкт типу Pattern, що містить шаблон.

Як тільки об'єкт типу Pattern  буде отримано, його можна використовувати для створення
об'єкта типу Matcher. Для цього викликається фабричний метод matcher (),
визначається в класі Pattern
Нижче наведена його загальна форма.
Matcher matcher (CharSequence рядок)
Тут параметр рядок - вхідна послідовність. В інтерфейсі CharSequence визначається набір символів, доступних тільки для читання. Серед інших, він реалізується в класі String. Таким чином, методу matcher () можна передати символьний рядок.

Таблиця всіх доступних констант і еквівалентних їм прапорів:
ConstantEquivalent Embedded Flag Expression
1Pattern.CANON_EQ-
2Pattern.CASE_INSENSITIVE(?i)
3Pattern.COMMENTS(?x)
4Pattern.MULTILINE(?m)
5Pattern.DOTALL(?s)
6Pattern.LITERAL-
7Pattern.UNICODE_CASE(?u)
8Pattern.UNIX_LINES(?d)

Клас Mаtcher

У цього класу відсутні конструктори. Замість цього для створення об'єкта класу Matcher викликається фабричний метод  matcher(), який визначається в класі Pattern, як пояснювалося вище. Як тільки об'єкт класу Matcher буде створений, його методи можна використовувати для виконання різних операцій зіставлення з шаблоном.

Найпростішим для зіставлення з шаблоном є метод matches (), який просто визначає, чи збігається послідовність символів з шаблоном. Загальна форма цього методу приведена нижче.
boolean matches ()
Цей метод повертає логічне значення true, якщо послідовність символів збігається і шаблоном, а інакше - логічне значення false. Cлід, однак, мати на увазі, що з шаблоном повинна збігатися вся послідовність символів, а не тільки її частинf (тобто підпослідовність).

Щоб визначити, чи збігається з шаблоном підпослідовність з вхідних послідовності символів, слід викликати метод find ():
boolean find ()
Цей метод повертає логічне значення true, якщо підпослідовність збігається з шаблоном, а інакше - логічне значення false. Метод find () можна викликати неодноразово, щоб знаходити всі співпадаючі підпослідовності. 
При кожному виклику методу find() порівняння починається з того місця, де було завершено попереднє порівняння. 
Символьний рядок, що містить останню співпавшу послідовність, можна отримати, викликавши метод group (). Нижче наведена одна з його загальних форм.
String group ()
Цей метод повертає символьний рядок, що співпав. Якщо ні одного збігу не виявлено, генерується виключення типу IllegalStateException.
Викликавши метод start (), можна отримати індекс поточного співпадіння у вхідній послідовності символів, а індекс, наступний після поточного збігу, - викликавши метод end(). Нижче наведені загальні форми цих методів.
int start ()
int end ()
За відсутності збігів обидва ці методу генерують виняток типу IllegalStateException.
Кожну послідовність символів, що співпадає можна замінити іншою послідовністю, викликавши метод replaceAll (). Його загальна форма виглядає наступним чином:
String replaceAll (String новий_рядок)
де параметр новий_рядок визначає нову послідовність символів, яка буде замінювати послідовності, що співпали з шаблоном. Оновлена вхідна послідовність буде повернута у вигляді символьного рядка.

Клас Scanner

.