У цій серії уроків ми навчимося використовувати 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 - виняток, що означає синтаксичну помилку в вираженні.
Надалі ми розглянемо детально кожен з цих класів. Але спочатку необхідно розуміти, як влаштовані регулярні вирази. Розглянемо тестову програму для розуміння синтаксису регулярних виразів.
import java.io.Console; import java.util.regex.Pattern; import java.util.regex.Matcher; public class RegexTestHarness {public static void main (String [] args) {Console console = System.console (); if (console == null) {System.err.println ( "No console."); System.exit (1); } While (true) {Pattern pattern = Pattern.compile (console.readLine ( "% nEnter your regex:")); Matcher matcher = pattern.matcher (console.readLine ( "Enter input string to search:")); boolean found = false; while (matcher.find ()) {console.format ( "I found the text" + "\"% s \ "starting at" + "index% d and ending at index% d.% n", matcher.group ( ), matcher.start (), matcher.end ()); found = true; } If (! Found) {console.format ( "No match found.% N"); }}}}
Створіть програму 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.
У наступному прикладі ви помітите деякі особливості: наступне збіг починається там, де закінчується попереднє:
Enter your regex: foo Enter input string to search: foofoofoo I found the text foo starting at index 0 and ending at index 3. I found the text foo starting at index 3 and ending at index 6. I found the text foo starting at index 6 and ending at index 9.
метасимволи
Дане 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?Як регулярні вирази представлені в Java?
Метасимволи, підтримувані API: <([{\ ^ - = $! |]})?