MyTetra Share
Делитесь знаниями!
Регулярные выражения
Время создания: 07.09.2017 13:12
Текстовые метки: knowledge
Раздел: Java - Work with text - Парсинг
Запись: xintrea/mytetra_db_mcold/master/base/1504779144iaq54odfnt/text.html на raw.githubusercontent.com

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

Пакет java.util.regex поддерживает обработку регулярных выражений (regular expression).

Вот, что пишут в Википедии про регулярные выражения:

Регулярные выражения используются некоторыми текстовыми редакторами и утилитами для поиска и подстановки текста. Например, при помощи регулярных выражений можно задать шаблоны, позволяющие:
найти все последовательности символов «кот» в любом контексте, как то: «кот», «котлета», «терракотовый»;
найти отдельно стоящее слово «кот» и заменить его на «кошка»;
найти слово «кот», которому предшествует слово «персидский» или «чеширский»;
убрать из текста все предложения, в которых упоминается слово кот или кошка.

Последнее предложение мне не нравится, кто-нибудь может отредактировать эту страницу?

В Java могут использоваться нестандартные приёмы использования регулярных выражений по синтаксису. Например, во многих языках выражение \\ означает, что ищется символ обратного слеша, который идёт за специальным мета-символом регулярного выражения. В Java придётся использовать для этой цели \\\\. Но таких различий немного.

Пакет содержит два класса - Pattern и Matcher, которые работают вместе. Класс Patern применяется для задания регулярного выражения. Класс Matcher сопоставляет шаблон с последовательностью символов.

Регулярное выражение состоит из обычных символов, наборов символов и групповых символов. Обычные символы используются как есть. Если в шаблоне указать символы "кот", то эти символы и будут искаться в строке.

Символы новой строки, табуляции и др. определяются при помощи стандартных управляющих последовательностей, которые начинаются с обратного слеша (\). Например, символ новой строки можно задать как \n.

Наборы символов заключаются в квадратные скобки. Например, [cat] совпадает с символами c, a, t. Если поставить символ ^ перед набором символов - [^cat], то ищутся совпадения всех символов, кроме c, a, t.

Чтобы задать диапазон символов, используется дефис. Например, диапазон от 1 до 9 можно задать как [1-9].

Символ точки является групповым символом, который совпадает с любым символом вообще.

Также можно задать, сколько раз совпадает выражение.

  • + - совпадает один или более раз
  • * - совпадает нуль или более раз
  • ? - совпадает нуль или один раз

Конструкция Regex

Что считается совпадением

.

Любой символ

?

Ноль (0) или одно (1)повторение предшествующего

*

Ноль (0) или более повторений предшествующего

+

Одно (1) или более повторений предшествующего

[]

Диапазон символов или цифр

^

Отрицание последующего (то есть, "не что-то")

\d

Любая цифра (иначе, [0-9])

\D

Любой нецифровой символ (иначе, [^0-9])

\s

Любой символ-разделитель (иначе, [\n\t\f\r])

\S

Любой символ, отличный от разделителей (иначе, [^\n\t\f\r])

\w

Любая буква или цифра (иначе, [A-Za-Z_0-9])

\W

Любой знак, отличный от буквы или цифры (иначе, [^\w])

Например, выражение -?\\d+ будет искать число, у которого может быть минус (а может и нет).

Выражение c.t позволит найти слова catcot, но не cart.

Регулярные выражения встречаются в методах класса String.


System.out.println("-123".matches("-?\\d+")); // да

System.out.println("123".matches("-?\\d+")); // да

System.out.println("+123".matches("-?\\d+")); // нет

System.out.println("+123".matches("(-|\\+)?\\d+")); // да


Первые два выражения подходят под составленное выражение - либо число с минусом, либо число без знака. Со знаком плюс число не проходит проверку. Чтобы и этот вариант проходил, нужно видоизменить выражение (четвёртый вариант).

Нужно включить условие "может начинаться с + или -" с помощью вертикальной черты | (ИЛИ). Круглые скобки используются для группировки. Знак вопроса позволяет указать, что допустимо отсутствие знака. Знак плюса экранируется, так как является мета-символом.

Если вы зададите неверное выражение, то будет создано исключение PatternSyntaxException.

Регулярное выражение это своего рода шаблон, который может быть применен к тексту (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.

Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования