GrabDuck

Регулярные выражения в Java

:

RegEx

Регулярное выражение это своего рода шаблон, который может быть применен к тексту (String, в Java). Java предоставляет пакет java.util.regex для сопоставления с регулярными выражениями. Регулярные выражения очень похожи на язык программирования Perl и очень просты в освоении.
Регулярное выражение или соответствует тексту (его части) или нет.
* Если регулярное выражение совпадает с частю текста, то мы можем найти еe.
** Если регулярное выражение составное, то мы можем легко выяснить, какая часть регулярного выражения совпадает с какой частью текста.

Первый пример
Регулярное выражение " [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 Соответствует буквам.
\W Соответствует не буквенным символам.
\s Соответствует пробелам. Эквивалентно [\t\n\r\f].
\S Не пробельные символы.
\d Соответствует цифрам. Эквивалентно [0-9].
\D Соответствует не цифрам.
\G Соответствует точки последнего совпадения.
\n Соответствует новой строке.
\b Совпадает на границе слова.
\B Совпадает не на границе слова.
\n, \t, etc. Символы новой строки, возврата каретки, вкладки и т.д.
\Q Цитата все символы до \ E.
\E Заканчивается цитирование начатое с \ Q.

Оригинал перевода
Отличный туториал
Reference — What does this regex mean?
Визуализатор для проверки
Отличный дебаггер с визуализацией