Освой программирование играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
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.