Регулярні вирази, приклади - 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, bcdcdbdbdbdbdbzzzzbbzbzb, 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< /span>
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:\\\\\\.*";

— Ого! Нічого собі. Знатиму.

— І якщо ти вирішив сильніше в цьому розібратися, то ось тобі кілька хороших посилань:

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