JavaRush /Java блог /Random UA /Регулярні вирази у Java
terranum
28 рівень
Milan

Регулярні вирази у Java

Стаття з групи Random UA
RegExРегулярне вираз це свого роду шаблон, який може бути застосований до тексту (String, Java). Java надає пакет java.util.regex для порівняння з регулярними виразами. Регулярні висловлювання дуже схожі на мову програмування Perl і дуже прості в освоєнні. Регулярне вираз чи відповідає тексту (його частини) чи ні. * Якщо регулярне вираз збігається з частиною тексту, ми можемо знайти ee. ** Якщо регулярний складовий вираз, то ми можемо легко з'ясувати, яка частина регулярного виразу збігається з якою частиною тексту.

Перший приклад

Регулярний вираз " [a-z] +" відповідає всім малим літерам у тексті. [a-z]означає будь-який символ від aвключно z, і +означає "один або більше" символів. Припустимо, що ми поставляємо рядок "code 2 learn java tutorial". Як це зробити в Java По-перше, ви повинні скласти шаблон:
import java.util.regex.*;
Pattern p = Pattern.compile([a-z]+);
Далі ви повинні створити matcherдля тексту, надіславши повідомлення на схемі:
Matcher m = p.matcher(“code 2 learn java tutorial”);
ПРИМІТКА: Не Patternмають Matcherконструкторів, ми створюємо їх за допомогою методів класу Pattern. Pattern Class:Об'єкт класу становить уявлення регулярного висловлювання. Клас Pattern не передбачає жодних громадських конструкторів. Щоб створити шаблон, необхідно спочатку викликати один із публічних статичних методів, які потім повертають об'єкт класу Pattern. Ці методи приймають регулярне вираження як аргумент. Matcher Class:Об'єкт "Шукач" є двигуном, який інтерпретує шаблон і виконує операції зіставлення із вхідним рядком. Як і Patternклас, Matcherнемає публічних конструкторів. Ви отримуєте об'єкт Matcherвикликом методу matcher, на об'єкті класуPattern. Після того як ми виконали ці кроки, і тепер у нас є екземпляр класу Matcher m ,і тепер ми можемо перевірити, чи був знайдений шаблон чи ні, і якщо так, то в якій позиції, і т.д. m.matches()повертає true, якщо шаблон відповідає всьому рядку, інакше false. m.lookingAt()повертає true, якщо шаблон відповідає початку рядка, і false інакше. m.find ()повертає true, якщо шаблон збігається із будь-якою частиною тексту.

Знаходимо збіг

Після успішного зіставлення, m.start() поверне індекс першого символу, що збігся і m.end() поверне індекс останнього символу, що збігся, плюс один. Якщо було зроблено невдалу спробу і збіги не знайшлося, m.start()і m.end()кидатимутьIllegalStateException
  • Це RuntimeException, так що вам не доведеться його ловити.
Може здатися дивним, що m.end()повертає індекс останнього символу плюс один, але це саме те, що потрібно більшості методів класу String.
  • Наприклад,“Now is the time“.substring(m.start(), m.end())
поверне той самий рядок. Погляньмо на код:
import java.util.regex.*;

public class RegexTest {
    public static void main(String args[]) {
        String pattern = "[a-z]+";
        String text = "code 2 learn java tutorial";
        Pattern p = Pattern.compile(pattern);
        Matcher m = p.matcher(text);
        while(m.find()) {
            System.out.print(text.substring(m.start(), m.end()) + "*");
        }
    }
}
Output: code*learn*java*tutorial*

Додаткові методи

Якщо є збіг, то:
  • m.replaceFirst(replacement)повертає новий рядок, де перший підрядок, що збігся з шаблоном буде замінено наreplacement
  • m.replaceAll(replacement)повертає новий рядок, де кожен підрядок, що збігся з шаблоном буде замінено
  • m.find(StartIndex)знаходити таку відповідність, починаючи з зазначеного індексу
  • m.reset()скидає шаблон
  • m.reset(NewText)скидає шукач, і дає йому новий текст (можливо String, StringBufferабо CharBuffer)

Синтаксис регулярних виразів

  • ^Відповідає початку рядка.
  • $Відповідає кінцю рядка.
  • .Відповідає будь-якому одиночному символу, окрім нового рядка. Використання опції m дозволяє йому відповідати новому рядку.
  • [...]Відповідає будь-який одиночний символ у дужках.
  • [^ ...]Відповідає будь-якому символу, не в дужках.
  • \AПочаток весь рядок.
  • \zКінець всього рядка.
  • \ZКінець всього рядка, окрім кінцевого термінатора лінії.
  • re*Відповідає 0 або більше входжень попереднього виразу.
  • re+Один або більше збігів попереднього виразу.
  • re?Відповідає 0 або 1 місцезнаходження попереднього виразу.
  • re{n}Відповідає рівно N Кількість входжень попереднього виразу.
  • re{n,}Відповідає N або більше входжень попереднього виразу.
  • re{n, m}Відповідає не менше n і не більше m входжень попереднього виразу.
  • a|bВідповідає a або b.
  • (re)Група регулярних виразів та пам'ятає знайдений текст.
  • (?: re)Групи регулярних виразів, які не пам'ятають знайдений текст.
  • (?> re)Відповідає незалежному шаблону без повернення.
  • \wВідповідає буквам та цифрам [a-zA-Z_0-9].
  • \WЦе не букви та не цифри.
  • \sВідповідає пробілам. Еквівалентно [\t\n\r\f].
  • \SЧи не пробілові символи.
  • \dВідповідає цифрам. Еквівалентно [0-9].
  • \DВідповідає не цифрам.
  • \GВідповідає точки останнього збігу.
  • \nВідповідає новому рядку.
  • \bЗбігається на межі слова.
  • \BЗбігається не межі слова.
  • \n, \t, etc.Символи нового рядка, повернення каретки, вкладки тощо.
  • \QЦитата всі символи до \ E.
  • \EЗакінчується цитування розпочате з \Q.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ