— А зараз я розповім тобі про регулярні висловлювання. Це водночас і складна, і проста тема. Щоб досконало розібратися в регулярних виразах, може знадобитися прочитати пару-трійку нетонких книг, але навчити тебе користуватися ними я можу прямо зараз.
Як люблять жартувати досвідчені програмісти – якщо у вас є проблема і ви захотіли вирішити її за допомогою регулярних виразів, то тепер у вас дві проблеми. strong>
— Гм.
— Сподіваюся, я не сильно тебе залякав, мій друже. Ні?
От і чудово. Отже, нова тема чи що таке «регулярні висловлювання»?
Якщо дуже спростити, то регулярні вирази – це шаблон для рядка.
Ти можеш перевірити – відповідає певний рядок заданому шаблону чи ні. Також можна розбивати рядок на частини, використовуючи символ-розділювач або рядок-шаблон.
Але почнемо з простого – що ж таке шаблон рядка?
У 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, 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:\\\\\\.*"; |
— Ого! Нічого собі. Знатиму.
— І якщо ти вирішив сильніше в цьому розібратися, то ось тобі кілька хороших посилань:
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ