— А сейчас я расскажу тебе о регулярных выражениях. Это одновременно и сложная, и простая тема. Чтобы досконально разобраться в регулярных выражениях может понадобиться прочитать пару-тройку нетонких книг, но научить тебя пользоваться ими я могу прямо сейчас.
Как любят шутить опытные программисты – если у вас есть проблема и вы захотели решить ее с помощью регулярных выражений, то теперь у вас две проблемы.
— Гм.
— Надеюсь, я не сильно тебя запугал, мой друг. Нет?
Вот и отлично. Итак, новая тема или что же такое «регулярные выражения»?
Если сильно упростить, то регулярные выражения – это шаблон для строки.
Ты можешь проверить – соответствует ли некоторая строка заданному шаблону или нет. Также можно разбивать строку на части, используя символ-разделитель или строку-шаблон.
Но начнем с простого – что же такое шаблон строки?
В SQL, не в Java, при сравнении строк можно проверять – совпадает ли строка с определенным шаблоном или нет. Вот как это выглядит:
name like 'Alex%'
Тут name – это переменная, like – это команда для проверки шаблона, а ‘Alex%’ – это шаблон.
В данном случае % обозначает любую строку или подстроку.
Шаблон | Строки подходящие под шаблон |
---|---|
‘Alex%’ | Alex Alexandr Alexander Alexandra …. |
‘%x%’ | Max Maxim Alexandr … |
‘%a’ | Olga Helena Ira … |
Если нужно было обозначить, что любой символ должен быть всего один, то для этого в SQL используется знак подчеркивания – «_».
Шаблон | Строки подходящие под шаблон |
---|---|
‘Alex%_’ | Alexandr Alexander Alexandra …. |
‘_x’ | Ax Bx Cx … |
‘___’ | Aaa Aab Bbb … |
— В общем – понятно.
— Отлично, тогда перейдем к регулярным выражениям.
В регулярных выражениях принято задавать ограничение не только на «количество символов», но и на «содержание символа». Любая «маска» обычно состоит из двух (иногда больше) частей, первая из которых описывает «предпочтения» в символах, а вторая часть – их количество.
Вот тебе несколько примеров содержания символа:
Шаблон | Описание | Примеры |
---|---|---|
. | Один любой символ | 1 |
\d | Любая цифра | 7 |
\D | Любая нецифра | C |
\s | Пробел, перенос строки, символ табуляции | ‘ ‘ |
\S | Что угодно, кроме пробела, табуляции, переноса строки | f |
[a-z] | Любая буква от a до z | z |
[0-9] | Любая цифра от 0 до 9. | 8 |
\w | Любой цифробуквенный символ или нижнее подчеркивание | c |
\W | Любой не цифробуквенный символ | - |
— Сразу не запомню, но выглядит не очень сложно.
— Отлично, тогда еще примеры количества символов в маске:
Шаблон | Описание | Примеры |
---|---|---|
A? | Символ A встречается 0..1 раз | A |
B+ | Символ B встречается 1.. ∞ раз | BBBB |
C* | Символ C встречается 0.. ∞ раз | CCC |
D{n} | Символ D встречается n раз | DDDD, для шаблона D{4} |
E{n,} | Символ E встречается n.. ∞ раз | EEEEEEE, для шаблона E{2,} |
F{n,m} | Символ F встречается n..m раз | EEEE, для шаблона E{2,4} |
— Тут вообще все очевидно.
— Ты схватываешь все просто на лету. А теперь посмотрим, как все это смотрится вместе:
Шаблон | Описание | Примеры |
---|---|---|
[a-d]? | Символы a-d встречаются 0..1 раз | a, b, c, d |
[b-d,z]+ | Символы b,c,d,z встречаются 1.. ∞ раз | b, bcdcdbdbdbdbzzzzbbzbzb, zbz |
[1,7-9]* | Символы 1,7,8,9 встречаются 0.. ∞ раз | 1, 7, 9, 9777, 111199 |
1{5} | Символ 1 встречается 5 раз | 11111 |
[1,2,a,b]{2} | Символы 1,2,a,b встречаются 2 раза | 11, 12, 1a, ab, 2b, bb, 22 |
[a,0]{2,3} | Символы a,0 встречаются 2..3 раз | aa, a0,00,0a, aaa,000, a00,0a0, a0a |
— Так понятно же все.
— Да. Гм. Или я все очень хорошо объясняю или ты слишком хорошо соображаешь. Но и то, и то нам на руку.
Вот тебе еще пара новых моментов.
Т.к. регулярные выражения часто используют для поиска подстрок в строке, то в шаблон добавлены еще два символа ^ и $.
«^» — означает, что подстрока обязана включать начало строки.
«$» — означает, что подстрока обязана включать конец строки.
Примеры:
Шаблон | Строка и найденные подстроки, совпадающие с шаблоном |
---|---|
a{3} | aaa a aaa a aaa |
a{3}$ | aaa a aaa a aaa |
^a{3} | aaa a aaa a aaa |
^a{3}$ | aaa a aaa a aaa |
И еще одно важное дополнение.
В регулярных выражениях символы «[ ] \ / ^ $ . | ? * + ( ) { }» имеют специальное значение. Их еще называют «управляющие символы». Поэтому просто так их использовать в строке нельзя.
Как и в Java их необходимо экранировать. Для этого, как и в Java, используется символ «\».
Если мы хотим описать, что строка должна состоять из трех символов «?», то нельзя писать так: ?{3}, т.к. символ «?» является управляющим. Надо сделать так: \?{3}, если мы хотим задать символ «\», то надо написать «\\».
— Ок, понятно.
— А теперь еще маленькая интересная новость. В java, в файлах с кодом, внутри строк символ «\» тоже нужно экранировать, т.к. он является управляющим.
— Ну да.
— Так вот, если ты попытаешься задать шаблон регулярного выражения в java внутри строки, то тебе нужно будет экранировать символ \ дважды.
Пример:
Я хочу задать маску «c:\что-угодно» |
Регулярное выражение, по идее, должно выглядеть так: один символ «с», двоеточие, слеш, точка и звездочка (для обозначения любого количества символов).Я добавил пробелов для лучшей читабельности: c : \ .* Но символы «\» и «.» нужно экранировать, поэтому регулярное выражение будет выглядеть так: c : \\\.* Или, без пробелов c:\\\.* |
В регулярном выражении у нас должно быть три слеша (слеш – косая черта) Поэтому регулярное выражение в java-файле будет выглядеть так: String regexp = "c:\\\\\\.*"; |
— Ого! Ничего себе. Буду знать.
— И если ты решил посильнее в этом разобраться, то вот тебе пара хороших ссылок: