Регулярные выражения в Java. Часть 2
Продолжаем изучение регулярных выражений и java.util.regex API, предыдущий урок — Регулярные выражения в Java. Часть 1.
Символьные классы
Символьные классы — это набор символов, заключенных в квадратные скобки.
Конструкция | Описание |
---|---|
[abc] |
a, b, или c (простой класс) |
[^abc] |
любой символ, кроме a, b, или c (отрицание) |
[a-zA-Z] |
символы от a до z, или от A до Z, включительно (диапазон символов) |
[a-d[m-p]] |
от a до d, или от m до p: [a-dm-p] (объединение) |
[a-z&&[def]] |
d, e, или f (пересечение) |
[a-z&&[^bc]] |
от a до z, кроме b и c: [ad-z] (вычитание) |
[a-z&&[^m-p]] |
от a до z, исключая символы от m доh p: [a-lq-z] (вычитание) |
Простые классы
Самая простая форма символьных классов — перечисление символов в квадратных скобках. Например, регулярное выражение [bcr]at
соответствует словам «bat», «cat», или «rat», потому что оно определяет класс, принимающий буквы «b», «c», или «r» в качестве первого символа.
Запустите программу, приведенную в первом уроке, и протестируйте с этим регулярным выражением:
Enter your regex: [bcr]at Enter input string to search: bat I found the text "bat" starting at index 0 and ending at index 3. Enter your regex: [bcr]at Enter input string to search: cat I found the text "cat" starting at index 0 and ending at index 3. Enter your regex: [bcr]at Enter input string to search: rat I found the text "rat" starting at index 0 and ending at index 3. Enter your regex: [bcr]at Enter input string to search: hat No match found.
В приведенных примерах соответствие успешно только, когда первая буква подходит символу, определенному в символьном классе.
Отрицание
Для нахождения символов исключая перечисленные, используйте метасимвол «^
» в начале символьного класса. Такая техника называется отрицанием.
Enter your regex: [^bcr]at Enter input string to search: bat No match found. Enter your regex: [^bcr]at Enter input string to search: cat No match found. Enter your regex: [^bcr]at Enter input string to search: rat No match found. Enter your regex: [^bcr]at Enter input string to search: hat I found the text "hat" starting at index 0 and ending at index 3.
Подходят только те строки, которые не содержат символы определенные регулярным выражением.
Диапазоны символов
Иногда необходимо определить символьный класс, который содержит диапазон значений «от а до я» или цифры от 1 до 5. Для задания диапазонов используется метасимвол «-» между символами, например [1-5]
или [a-h]
. Вы также можете использовать разные диапазоны в одном символьном классе, например для [a-zA-Z]
подойдут строки, содержащие буквы алфавита, независимо от регистра: a — z (прописные) или A — Z (заглавные).
Несколько примеров отрицаний и диапазонов:
Enter your regex: [a-c] Enter input string to search: a I found the text "a" starting at index 0 and ending at index 1. Enter your regex: [a-c] Enter input string to search: b I found the text "b" starting at index 0 and ending at index 1. Enter your regex: [a-c] Enter input string to search: c I found the text "c" starting at index 0 and ending at index 1. Enter your regex: [a-c] Enter input string to search: d No match found. Enter your regex: foo[1-5] Enter input string to search: foo1 I found the text "foo1" starting at index 0 and ending at index 4. Enter your regex: foo[1-5] Enter input string to search: foo5 I found the text "foo5" starting at index 0 and ending at index 4. Enter your regex: foo[1-5] Enter input string to search: foo6 No match found. Enter your regex: foo[^1-5] Enter input string to search: foo1 No match found. Enter your regex: foo[^1-5] Enter input string to search: foo6 I found the text "foo6" starting at index 0 and ending at index 4.
Объединения
В также можете использовать объединения для создания символьного класса, который объединяет два или более разных символьных класса. Для создания объединения, просто заключите один внутри другого: [0-4[6-8]]
. Данное объединение создает единый символьный класс, для которого подходят числа 0, 1, 2, 3, 4, 6, 7, и 8.
Enter your regex: [0-4[6-8]] Enter input string to search: 0 I found the text "0" starting at index 0 and ending at index 1. Enter your regex: [0-4[6-8]] Enter input string to search: 5 No match found. Enter your regex: [0-4[6-8]] Enter input string to search: 6 I found the text "6" starting at index 0 and ending at index 1. Enter your regex: [0-4[6-8]] Enter input string to search: 8 I found the text "8" starting at index 0 and ending at index 1. Enter your regex: [0-4[6-8]] Enter input string to search: 9 No match found.
Пересечения
Для создания единого символьного класса, который определяет все вложенные в него, используйте &&
, например: [0-9&&[345]]
. Это выражение определяет строки, подходящие обоим вложенным классам, т.е. цифры 3, 4 и 5.
Enter your regex: [0-9&&[345]] Enter input string to search: 3 I found the text "3" starting at index 0 and ending at index 1. Enter your regex: [0-9&&[345]] Enter input string to search: 4 I found the text "4" starting at index 0 and ending at index 1. Enter your regex: [0-9&&[345]] Enter input string to search: 5 I found the text "5" starting at index 0 and ending at index 1. Enter your regex: [0-9&&[345]] Enter input string to search: 2 No match found. Enter your regex: [0-9&&[345]] Enter input string to search: 6 No match found.
Вычитание
Наконец, вы можете использовать вычитания для отрицания одного или нескольких символьных класса, например: [0-9&&[^345]]
. Этот пример создает класс, подходящий цифрам от 0 до 9, исключая числа 3, 4 и 5.
Enter your regex: [0-9&&[^345]] Enter input string to search: 2 I found the text "2" starting at index 0 and ending at index 1. Enter your regex: [0-9&&[^345]] Enter input string to search: 3 No match found. Enter your regex: [0-9&&[^345]] Enter input string to search: 4 No match found. Enter your regex: [0-9&&[^345]] Enter input string to search: 5 No match found. Enter your regex: [0-9&&[^345]] Enter input string to search: 6 I found the text "6" starting at index 0 and ending at index 1. Enter your regex: [0-9&&[^345]] Enter input string to search: 9 I found the text "9" starting at index 0 and ending at index 1.
Следующая статья: Основы регулярных выражений в Java. Часть 3.
Нет комментариев