Регулярные выражения, примеры - 1

— А сейчас я расскажу тебе о регулярных выражениях. Это одновременно и сложная, и простая тема. Чтобы досконально разобраться в регулярных выражениях может понадобиться прочитать пару-тройку нетонких книг, но научить тебя пользоваться ими я могу прямо сейчас.

Как любят шутить опытные программисты – если у вас есть проблема и вы захотели решить ее с помощью регулярных выражений, то теперь у вас две проблемы.

— Гм.

— Надеюсь, я не сильно тебя запугал, мой друг. Нет?

Вот и отлично. Итак, новая тема или что же такое «регулярные выражения»?

Если сильно упростить, то регулярные выражения – это шаблон для строки.

Ты можешь проверить – соответствует ли некоторая строка заданному шаблону или нет. Также можно разбивать строку на части, используя символ-разделитель или строку-шаблон.

Но начнем с простого – что же такое шаблон строки?

В SQL, не в Java, при сравнении строк можно проверять – совпадает ли строка с определенным шаблоном или нет. Вот как это выглядит:

name like 'Alex%'

Тут name – это переменная, like – это команда для проверки шаблона, а ‘Alex%’ – это шаблон.

В данном случае % обозначает любую строку или подстроку.

Шаблон Строки подходящие под шаблон
‘Alex%’ Alex
Alexandr
Alexander
Alexandra
….
‘%x%’ Max
Maxim
Alexandr
‘%a’ Olga
Helena
Ira

Если нужно было обозначить, что любой символ должен быть всего один, то для этого в SQL используется знак подчеркивания – «_».

Шаблон Строки подходящие под шаблон
‘Alex%_’ 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:\\\\\\.*";

— Ого! Ничего себе. Буду знать.

— И если ты решил посильнее в этом разобраться, то вот тебе пара хороших ссылок:

Лекция на вики