Освой программирование играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

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

Пакет 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 позволит найти слова cat, cot, но не 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.

Реклама