Навіщо потрібні RegExp




Навіщо потрібні RegExp



Що таке регулярні вирази

Як знайти у тексті всі числа з чотирьох цифр чи всі email-адреси? Розповідаємо про регулярні висловлювання — потужний інструмент для аналізу та редагування текстів, який використовується програмістами, фахівцями в NLP та Digital Humanities, а також біоінформатиками. Регулярні вирази - це класика комп'ютерних методів обробки текстових даних, вони використовуються набагато довше, ніж усі новомодні методи, пов'язані з машинним навчанням та нейромережами. Але досі багато завдань простіше і краще вирішуються саме регулярками!

⚠️ Цей текст — максимально короткий вступ до регулярних виразів. Якщо ви хочете розібратися докладніше, у «Системного Блоку» є великий гайд за регулярними виразами у трьох частинах: раз, два, три.

Що таке регулярні вирази?

Регулярні вирази (Regular Expression або Regex) – це інструмент для роботи з текстом, який дозволяє шукати та змінювати підрядки у тексті, що відповідають заданому шаблону.

Наприклад, представимо великий текстовий файл з даними про студентів: іменами, прізвищами та адресами електронної пошти. У цьому файлі потрібно знайти всі адреси, щоб скласти розсилку. У адресах електронної пошти загальна структура: вони складаються з двох рядків, розділених символом @, тому можна задати регулярне вираз, який описує цю структуру, і потім використовувати його для пошуку всіх адрес.

Як влаштовані регулярні вирази?

Регулярні вирази складаються із символів, які представляють певні шаблони та правила пошуку. Ось деякі з найчастіше використовуваних:

  1. Символи. Звичайні символи відповідають собі. Наприклад, вираз «abc» знайде всі рядки «abc» у тексті.
  2. Метасимволи - Спеціальні символи, які представляють класи символів. Наприклад, символ "." відповідає будь-якому символу, а символ \d відповідає будь-якій цифрі.
  3. Групи і альтернатива дозволяють об'єднувати символи групи (кордони групи позначаються дужками) і шукати альтернативи (альтернація позначається символом «|»). Наприклад, вираз "(abc | def)" знайде або "abc", або "def".
  4. Квантифікатори визначають кількість повторень символу чи групи символів. Символ «+» відповідає одному або більше входженням попереднього символу або групи символів.

Наведемо приклад регулярного виразу, який вирішує задачу пошуку адрес електронної пошти. Електронна адреса складається з імені користувача та доменного імені (gmail.com, mail.ru і так далі), ці дві частини розділені символом @. Задамо регулярне вираз, яке вирішує це завдання (для простоти прикладу припустимо, що всі домени знаходяться або в ru або в com):

Цей регулярний вираз містить три групи:

  1. Група (.+) (до символу «@») відповідає імені користувача, яке являє собою хоча б один (хоча б одиничне входження визначається квантифікатором «+») символ (будь-який символ позначається метасимволом «.»).
  2. Група (.+), яка йде після символу @, задає доменне ім'я.
  3. У групі (com|ru), яка йде після "\." містяться два рядки: «com» ​​та «ru», символом альтернативи «|» ми говоримо, що в тексті може бути або «com», або «ru».

"\" перед точкою дозволяє розрізняти метасимволи, межі групи та квантифікатори від звичайних символів. Так «.» - це метасимвол, а "\." означає просто точку.

Зазначимо, що насправді адреси електронних пошт визначаються великою кількістю правил: наприклад, ім'я користувача не може містити деякі символи.

Де використовуються регулярні вирази?

Регулярні висловлювання використовуються для аналізу текстів у NLP та Digital Humanities, у біоінформатиці для пошуків патернів у геномах. Також програмісти користуються ними для швидкого редагування тексту коду та для валідації вхідних даних користувача: перевірки правильності введеної електронної пошти, дати та інших даних, які мають дотримуватися певного шаблону.

Регулярні вирази

Матеріал взятий із курсу Skillbox "Професія Python-розробник".

Додатковий матеріал вивчення.

Терміни re, regex чи RegExp є скороченням від англійської Regular Expressions. Це своєрідна мова для написання шаблонів, які використовуються в пошуку підрядка в рядку (тексті).

Навіщо потрібні такі складнощі?

  • Рядки є об'єктами, що індексуються, і ми без проблем можемо знайти потрібний нам символ або підрядок у рядку, пройшовшись по ній циклом.
  • Можемо перевірити, що рядок є email'ом за допомогою функції split та різних порівнянь. Можемо замінити все "щось" на "щось" і т.д. Але це незручно.
  • За допомогою синтаксису регулярних виразів ми можемо створити шаблон для пошуку підрядка, навіть якщо ми самі не знаємо які саме символи нам потрібно знайти.

Приклад №1 – У пошуках Немо®

Історія: Серед прекрасних тропічних морських стихій, у районі Великого бар'єрного рифу на самоті живе риба-клоун на ім'я Марлін. Він виховує свого єдиного синочка Немо.
Океан і існуючі в ньому небезпеки дуже лякають Марліна, і він як може захищає сина від них, але молодий Немо, який страждає на зайву цікавість, дуже хоче дізнатися більше про таємничий риф, поряд з яким вони живуть.
.
Коли Немо за іронією долі виявляється далеко від дому, та ще й стикається з загрозою стати обідом риби-танку, Марлін вирушає на пошуки сина.
Але Марлін, звичайно ж, розуміє, що героїчний рятувальник з нього не вийде і просить допомоги в пошуках RegExp.

deep_ocean
=
'''oCeAn Marlin Ocean ocean ocean ocean ocean ocean ocean ocean ocean ocean ocean ocean ocean ocean ocean
OCEAN OCEAn OCEan OCean Ocean ocean ocean ocean ocean ocean ocean ocean ocean ocean ocean ocean ocean
oceán ocean ocean nemaa oceán ocean oceán ocean oceán ocean oceán omo ocean ocean ocean ocean oceán
ocean ocean ocean ocean ocean ocean ocean ocean onema ocean ocean ocean ocean ocean ocean ocean ocean ocean
Ocean ocean ocean ocean ocean nenemo ocean ocean ocean ocean ocean ocean ocean ocean ocean ocean
OCEAN OCEAN OCEAN OCEAN OCEAN OCEAN OCEAN OCEAN OCEAN OCEAN OCEAN OCEAN OCEAN OCEAN OCEAN OCEAN OCEAN
OCEan OCean Ocean ocean '''

Етапи розв'язання

  1. Насамперед ми створюємо шаблон для пошуку. Спершу корисно сформувати його словами: Нам потрібно знайти всі згадки про Немо і врахувати, що інформатори могли помилитися в кінці його імені, оскільки океан великий і в ньому багато різних діалектів.
  2. Таким чином завдання виглядає так - нам потрібні всі слова, що починаються з Nem (N може бути і малі), крім цього можливі різні закінчення розміром в 1-2 літери.
  3. Як написати такий вираз? Офіційна документація до бібліотеки re
  4. В результаті:
    • потрібно скласти шаблон із 4-5 букв,
    • перша може бути як малою, так і великою, + закінчення з 2 невідомих букв.
    • За букви відповідає символ \w, кількість повторів можна вказати за допомогою квантифікатора.
    • Першу літеру ми поміщаємо у квадратні дужки, щоб було обрано одну з них
nemo_pattern
=
r'[Nn]em\w'

Зверніть увагу на попередню r'' в описі рядка – це так звані сирі рядки.

Модуль re

Функції

У python з регулярними виразами працює модуль re

І ознайомимося з його основними функціями: Перша з них match, яка найчастіше працює швидше за інші функції пошуку, т.к. шукає збіги тільки з початку рядка

matched_at_begin
=
re.match(nemo_pattern,
deep_ocean)
print(matched_at_begin)
# None

search() ж шукає по всьому тексту, але тільки до першого збігу.

matched
=
re.search(nemo_pattern,
deep_ocean)
print(f'Повертається об'єкт
matched>
всередині якого міститься інформація про збіги')
# re.Match object

Цю інформацію можна отримати такими методами:

print(f'Підрядок, що збігся з патерном пошуку
matched.group()>')
# type 'str'
print(f'Індекс початку цього підрядку
matched.start()>')
# 'int'
print(f'І індекс її закінчення
matched.end()>')
# 'int'

Щоб отримати не тільки перший результат пошуку, ми можемо скористатися ітератором:

searching_iterator
=
re.finditer(nemo_pattern,
deep_ocean)
for
matched
in
searching_iterator:
сам по собі ітератор повертатиме об'єкти класу re.Match, як робив re.search
print(f'Наступний збіг:
matched.group()>')
# 'str'

Обшукавши майже весь океан, Марлін почав зневірятися, але не RegExp, повільним козирем у рукаві була функція findall()

full_search
=
re.findall(nemo_pattern,
deep_ocean)
print(f'Список з усіма збігами патерну, знайденими у всьому тексті
full_search>')
# 'list'

Прочухавши весь океан, ми бачимо, що в наші "мережі" потрапив і Nemo. Варто звернути увагу на те, що ця функція, на відміну від попередніх, повертає список з рядків. Тому ми не можемо застосувати методи отримання індексів. Однак, ми можемо використовувати цю інформацію для уточнення шаблону.

final_matched
=
re.search('Nemo',
deep_ocean)
print(f'Повернення об'єкта з потрібним збігом
final_matched>')
# re.Match object
print(f'Уточнення індексу початку
final_matched.start()>')
print(f'І кінця
final_matched.end()>')

Функція sub дозволяє не тільки здійснювати пошук, а й замінювати знайдене

transparent
=
re.sub(r'[Oo]\w
',
'',
deep_ocean)
print('Все, що збіглося з патерном було замінено, залишилося лише')
print(transparent)

Все, що збіглося з патерном було замінено, залишилося лише:

Marlin nemaa nemoO nenemo Nemo

Щоб позбавитися порожнеч і залишити лише наших рибок, можна трохи змінити шаблон.

cleared
=
re.sub(r'[Oo]\w
\s+',
'',
deep_ocean)
print('Тепер у тексті залишилися лише згадки наших рибок')
print(cleared)

На додаток до цієї функції, є ще одна, здатна розділяти текст як str.split() тільки як роздільник, використовуючи заданий підрядок

separation
=
re.split('nemoO',
cleared)
print(f'Список з частин, між якими був знайдений наш патерн
separation>')
# 'list'

Функція fullmatch() дуже прискіплива і повертає результат тільки у разі повного збігу

full_match
=
re.fullmatch('Marlin nemaa nemoO nenemo Nemo',
cleared)
print(f'Повного збігу знайдено не було
full_match>')
# None
full_match
=
re.fullmatch('Marlin nemaa nemoO nenemo Nemo ',
cleared)
print(f'А ось тепер збіг знайшовся
full_match>')
# re.Match object

А ви знайшли різницю?

Особливості синтаксису регулярних виразів

OR у регулярних виразах

У регулярних висловлюваннях існує аналог пітонівського or, це символ '|'
Він дозволяє зв'язати два шаблони в один, і якщо рядок підійде хоча б до одного з них, він підійде цьому новому шаблону.Так рядок підходить до шаблону А або до шаблону B підійде до шаблону A|B Наприклад, окремі овочі в тексті можна шукати за допомогою шаблону 'морковк|св[ее]кл|картошк|редис'

Екранування

У пайтоні символ '\', який у звичайних рядках означає екранування наступного символу. Т.к. у регулярних виразах більшість символів використовують '\' (\d,\w. ) Нам доведеться екранувати їх щоразу (\d, \w. ) Щоб уникнути цього, перед рядком додають літерал r, який повідомляє пайтон про те, що сприймати '\' можна не як символ, що екранує.

Проте! Серед спеціальних символів регулярних виразів є ті, що не використовують '\'
Наприклад '.' , але раптом нам у тексті потрібно буде знайти саме точку?
Її доведеться все ж таки екранувати слешем '\.'

У прикладі \(.*\) екрановані символи дужок.
Якби ми цього не зробили, дужки були б прийняті за спеціальні символи, які означають угруповання, суть якого ми розглянемо пізніше

Де можна налагодити складне регулювання?

На цьому сайті теж є відмінний відладник, який при цьому враховує синтаксис Пітона + є таблиця з підказками

Найпростіший зі своїх побратимів, для більш впевнених користувачів

Приклади

Завдання №1. Реєстраційні знаки транспортних засобів

У Росії її застосовуються реєстраційні знаки кількох видів. Спільне в них те, що вони складаються з цифр і букв. Причому використовуються лише 12 букв кирилиці, що мають графічні аналоги в латинському алфавіті - А, В, Е, К, М, Н, О, Р, С, Т, У та Х. * У приватних легкових автомобілях номери - це буква, три цифри, дві букви, потім дві або три цифри з кодом регіону. * У таксі - дві літери, три цифри, потім дві або три цифри з кодом регіону.* Є також інші види, але в цьому завдання вони не знадобляться.

# Завдання в тому, щоб із переліку номерів знайти номери приватних автомобілів та номери таксі:
license_plates
=
'А578ВЕ777 ОР233787 К901МН666 СТ46599 СНІ2929П777 666АМР666'
# Напишемо для кожного типу номерів свій шаблон:
private_template
=
r'[АВЕКМНОРСТУХ]\d
[АВЕКМНОРСТУХ]
\d'
taxi_template
=
r'[АВЕКМНОРСТУХ]
\d
\d'
private_cars
=
re.findall(private_template,
license_plates)
taxi_cars
=
re.findall(taxi_template,
license_plates)
print(f'Список номерів приватним автомобілів
private_cars>')
# ['А578ВЕ777', 'К901МН666']
print(f'Список номерів таксі
taxi_cars>')
# ['ОР233787', 'СТ46599']

Завдання №2

У розрахованій на багато користувачів онлайн грі введені нові правила неймінгу. Вам, як найвідповідальнішому правоохоронцю, доведеться перевірити всю базу даних, що зберігає імена персонажів і "заморозити" тих персонажів, імена яких не проходять нові правила.

Самі правила: * Обмеження довжини: від 3 до 17 символів * Обмеження алфавіту: всі англійські літери, крім xyz * Перший символ обов'язково має бути літерою, * в інших випадках допускаються парні цифри, підкреслення, слеші.

gamers
=
''' Dep3kuu_CaMypau41 3a_6a3ap_oTBeTb19 kypuTe_6aM6yk16 XoJIogHbIu_TankucT9
BupTyaJlbHblu_BouH8 cepDuTblu_oxoTHuk6 TTaPHuLLIa6 Алмазик5 9I_ODun_Takou_KPyTou4 9l_aBTopuTeT4
ABToMaT_kaJlaLLlHukoBa4 cepb3Hblu_4eJl4 cepb3Hblu_napHuLLIa4 kpyTa9l_6a3yka4 TIpocTo_He_xaMu4 ÊÐÌÑÕRÕG3
3a_6a3ap_oTBe4al-o3 Cama_OTTacHocTb3 cepb3Hblu3 cJlblLLI_He_Tblkau3 M9TA3 MaJlo_BpeMeHu3
ToHupoBka_no_kpyry3 '''
naming_rules
=
r'\s[a-wA-W][a-wA-W0-9\/_]\s'
# Початок і кінець укладені \s щоб відокремити збіги один від одного
survivors
=
re.findall(naming_rules,
gamers)
print(f'Список ніків, які пройшли перевірку
survivors>')

Завдання №3. Кількість слів у тексті.

У цій задачі словом буде вважатися послідовність букв, усередині якої може бути дефіс. У заданому тексті потрібно знайти кількість слів (не враховуючи спілки):

text_for_counting
=
'''- Вони м'ясні.
– М'ясні?
– Так. Вони виготовлені з м'яса.
– З м'яса?!
– Помилка виключена. Ми підібрали кілька екземплярів із різних частин планети, доставили на борт нашого
корабля-розвідника і добре протестували. Вони повністю з м'яса.
– Але ж це неймовірно! А як радіосигнали? А послання до зірок?
– Для спілкування вони використовують радіохвилі, але сигнали надсилають не самі. Сигнали походять від машин.
- Але хто будує ці машини? Ось із ким потрібен контакт!
– Вони й будують. Про що я тобі й говорю. М'ясо робить машини.
- Що за нісенітниця! Як може м'ясо виготовити машину? Ти хочеш, щоб я повірив у м'ясо з пам'яттю та почуттями?
rule_for_counting
=
r'[а-яА-Я-]'
# Щоб не заглиблюватися в правила російської мови, шукатимемо слова довжиною більше 2 символів.
words
=
re.findall(rule_for_counting,
text_for_counting)
print(f' Довжина списку знайдених збігів
len(words)>')

Групи у регулярному вираженні

Як ви могли помітити, в цих складних прикладах валідації поштових адрес часто використовуються круглі дужки (. )
Їхнє значення полягає у двох функціях:

    Ці дужки покликані скоротити повторювані групи всередині шаблонів. Наприклад:
    MAC-адреса мережевого пристрою зазвичай записується як шість груп з двох шістнадцяткових цифр, розділених символами '-' або ':'
    01:23:45:67:89:ab
    Без застосування скобкових груп шаблон виглядатиме так

Згрупувавши повторювані частини, можна за допомогою квантифікаторів задати кількість їх повторів:

Що навіть на такому прикладі дозволило значно скоротити розмір регулярного вираження.

Ще один сильний бік подібних угруповань у тому, що тепер ми можемо писати шаблон навіть не знаючи точної кількості груп. Адже в квантифікаторі можна вказати не тільки точне число, а й відрізок, на якому воно має бути

приклад

pattern
=
r'\s*([А-Яа-яйо]+)(\d+)\s*'
string
=
r'--- Знову45 ---'
matched
=
re.search(pattern,
string)
print(f'Збіг повернувся об'єктом
matched>')
# re.Match object

match[0] у звичайному випадку працює так само, як і match.group()
Але тепер за допомогою match[1] і match[2] ми можемо повернути підрядки, що збіглися з першою групою - ([А-Яа-яйо]+) - 'Знову' і з другої (\d+) - '45'.

print(f'Знайдено підрядок >matched[0]>< з позиції
matched.start(0)>
до
matched.end(0)>')
# Знайдено підрядок > Опять45 < з позиції 3 до 16print(f'Група літер >matched[1]>< з позиції
matched.start(1)>
до
matched.end(1)>')
# Група букв >Знову < з позиції 6 до 11print(f'Група цифр>matched[2]>< з позиції
matched.start(2)>
до
matched.end(2)>')
# Група цифр >45 < з позиції 11 до 13

Завдання №4

Вовочка підготував один дуже важливий лист, але скрізь вказав неправильний час. Тому необхідно замінити всі входження часу на рядок (TBD). Час - це рядок виду HH:MM:SS або HH:MM, у якому HH - число від 00 до 23, а MM і SS - число від 00 до 59.

letter
=
''' Шановні! Якщо ви до 09:00 не повернете
валізу, то вже о 09:00:01 я за себе не відповідаю.
PS. Зі ставленням 25:50 все нормально!'''
time_rule
=
r'([01]\d|2[0-3])(:[0-5][0-9])'
time_swap
=
re.sub(time_rule,
'(TBD)',
letter)
print(f'Лист Вовочки тепер виглядає так:
time_swap>')

Проблеми регулярних виразів

Серед програмістів ходить такий жарт:
“У вас є проблема. Ви вирішили використовувати регулярні вирази, щоб її вирішити. Тепер у вас дві проблеми.
Пов'язано це зі складністю регулярок. Можна написати шаблон і думати, що він робітник, але. це негаразд.
Наприклад однією з найпоширеніших завдань, щодо регулярних висловів, є валідація email. І хоч самі собою завдання цікаві, робити так на реальних прикладах не варто. Без чітких вимог до реєстрації e-mail адрес, зростає і розмір регулярних виразів.
Ось приклад одного з таких виразів:

(?:[a-z0-9!#$%&'*+/=?^_`<|>~-]+(?:\.[a-z0-9!#$%&'*+/ =?^_`<|>~-]+)*|"(?: [x01-x09x0bx0cx0e-x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0 -9])?\.)+[a-z0-9](?:[a -z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0) -9][0-9]?)\.)(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]? |[a-z0-9-]*[a-z0-9]:(?:[\x01-x08x0bx0cx0e-x1fx21-x5ax53-x7f]|\ [x01-x09x0bx0cx0e-x7f])+)\])

Підсумовуючи, треба визнати, що RegExp-и дуже потужний засіб для вирішення завдань обробки тексту. Але, як і будь-який потужний засіб, вимагає акуратного поводження. Щоб не вистрілити собі в ногу.

Як складати регулярні вирази

Регулярний вираз - Це послідовність символів (селекторів). Воно використовується для пошуку та обробки рядків, слів, чисел та інших текстових даних.

Регулярні висловлювання рятують під час вирішення різних завдань. Наприклад, за допомогою їх легко шукати і змінювати рядки в коді. Але найчастіше регулярні висловлювання використовують із валідації форм. Погляньмо, як це робити.

Шаблон регулярного вираження

Створити шаблон можна двома способами. Вибирайте той, що більше подобається:

Перший спосіб через New RegExp() :

regularExpression = new RegExp("регулярне вираження", "прапори");

Другий спосіб - через сліши:

regularExpression = /регулярне вираження/прапори;

Основні символи у регулярних виразах

Подивимося, чим наповнювати шаблон регулярного виразу: які селектори використовувати та що таке прапори.

Символи тексту

Літери та цифри – найпростіші символи. Наприклад, регулярний вираз оса знайде збіг навіть у слові «автосалон».

Символи початку та кінця рядка

Каретка ^ використовується для позначення початку рядка, а долар $ - для кінця. Наприклад, якщо ми напишемо ^оса$ , то збігом буде лише зі словом оса.

Класи символів

З їхньою допомогою вказуються діапазони символів. Тобто ви можете уточнити, які літери, цифри чи знаки можуть траплятися в регулярному виразі, а які ні.

[^] - Заперечення діапазону символів. Якщо коротко, можна виключити пошук конкретних символів. Наприклад, [^оса] не знайде збігів зі словом «оса», а ось з «осадками» збіг буде.

  • [0-9] - будь-яка цифра від нуля до дев'яти;
  • \ d - теж будь-яка цифра, це еквівалент [0-9].
  • [а-яйо] - будь-яка буква кирилиці в нижньому регістрі;
  • [а-яёА-ЯЁ] - будь-яка буква кирилиці в нижньому та верхньому регістрі;
  • [a-z] - будь-яка буква на латиниці в нижньому регістрі;
  • [a-zA-Z] - будь-яка буква на латиниці в нижньому та верхньому регістрі;
  • \w - будь-яка цифра, латинська буква або знак підкреслення.

Символи та розділові знаки:

Квантифікатори

Ці селектори перевіряють кількість повторень попереднього символу або групи символів:

  • - Збіг з точною кількістю, де n - це позитивне ціле число.Наприклад, конструкція [1-3] шукатиме одну цифру від одного до трьох.
  • - Діапазон збігів від мінімального до максимального. Наприклад, так можна вказати мінімальну та максимальну кількість символів для введення — . А ще одне із значень можна пропустити - або .
  • — одна чи нескінченна кількість збігів. Цей селектор рівнозначний запису.
  • + - одне або більше повторень. Цей селектор рівнозначний запису.
  • ? - Жодного або одне повторення. Селектор рівнозначний запису.

Модифікатори

Їх ще називають прапорами. Це певні параметри, які дають налаштування для пошуку або заміни тексту.

Модифікаторів багато, ми перерахуємо лише найпопулярніші:

  • i - не враховувати регістр літер;
  • g - шукати всі збіги;
  • u - підтримка юнікод-символів.

Альтернація

Простіше кажучи, це умова. Альтернація означає символ | та вказує кілька варіантів, які можуть відповідати регулярному виразу. Наприклад, регулярний вираз (яблуко|банан) шукатиме рядки, що містять або слово "яблуко", або "банан".

Символи групуються у дужках. При цьому можна додати умову «або» для будь-якої кількості символів: (a|b|c|d) .

💡 Це лише частина селекторів. Повний список ви знайдете на сайті MDN.

Як скласти регулярний вираз

Сформулюйте умову. Наприклад, ви хочете скласти регулярний вираз для перевірки логіну. Цей логін повинен бути довшим за три символи. Він може містити літери на кирилиці та латиниці або цифри. Регістр неважливий.

Складіть вираз. Наповніть шаблон селекторами, які підходять під ваші умови:

  • Логін містить літери чи цифри - /^[a-zа-яо0-9]/ .
  • Слово має бути не коротшим за три символи, максимальної довжини немає — /^[a-zа-яо0-9]/ .
  • Регістр неважливий - /^[a-zа-яо0-9] $ / i.

Протестуйте регулярний вираз. Напишіть власні тести або скористайтесь одним із онлайн-сервісів, наприклад, regex101.

Регулярні висловлювання можна скласти у різний спосіб — навіть два розробники-колеги напишуть для однієї й тієї ж завдання щось своє. Комусь важлива лаконічність — чим коротший вираз, тим краще. Хтось хоче передбачити всі варіанти - наприклад, раптом користувач введе в логіні нижнє підкреслення. А хтось просто добре знає можливості регулярок та гнучко використовує цей інструмент.

Приклади регулярних виразів

Регулярний вираз для телефонного номера

Допустимо, ми хочемо перевірити, чи користувач ввів телефон у форматі (XXX) XXX-XXXX . Можна скласти наступне регулярне вираз: /^\d-d-d$/ . Тут \d відповідає будь-якій цифрі, а фігурні дужки вказують кількість повторень.

Таке регулярне вираз буде відповідати рядкам, які починаються з дужки. За дужкою йдуть три цифри, потім пробіл, ще три цифри, дефіс та чотири цифри. Останнім іде символ кінця рядка.

✅ Під час перевірки 123-456-7890 буде відповідати шаблону, а (123) 456 7890 – ні.

Регулярний вираз для електронної пошти

Складемо регулярний вираз, який перевіряє формат пошти [email protected] - /^\w+([.-]?\w+)@\w+([.-]?\w+)(.\w)$/ . Вираз складний, тому давайте посімвольно розбирати, що тут відбувається:

  • ^ - Початок рядка.
  • \w - будь-яка літера, цифра або символ підкреслення.
  • + — вказує, що попередній символ (будь-яка буква, цифра або символ підкреслення) повинен повторюватися один або більше разів.
  • ([.-]?\w+)* — група символів. Вона починається з точки, дефісу чи жодного з них (?). За ними слідує одна або більше букв, цифр або символів підкреслення ( \w+ ). Зірочка вказує, що ця група може зустрічатися нуль або більше разів.
  • @ - Символ собаки, він обов'язковий в адресі електронної пошти.
  • \w - будь-яка літера, цифра або символ підкреслення.
  • ([.-]?\w+)* — аналогічна група символів, як описано вище.
  • . - Просто крапка.
  • \w - будь-які літери, цифри або символ підкреслення.
  • $ - кінець рядка.

Якщо коротко, цей регулярний вираз буде відповідати рядкам, які починаються з однієї або більше букв, цифр або символу підкреслення. За ними слідує символ @. Потім йде одна або більше група символів - вона складається з букв, цифр або підкреслення, розділених крапкою. Насамкінець — літери, цифри або знак підкреслення.

✅ Під час перевірки [email protected] відповідатиме цьому шаблону, а example.emailmail.com — ні.

Регулярний вираз для перевірки імені людини

Припустимо, ми хочемо перевірити, що введене ім'я містить лише літери і починається з великої літери. І тому можна скласти таке вираз: /^[А-Я][а-яё]*$/ . Тут [А-Я] відповідає будь-якій великій літері, а [а-яйо] - будь-якій букві в нижньому регістрі. Зірочка вказує, що попередній символ може повторюватися нуль або більше разів.

✅ Під час перевірки ім'я Іван буде відповідати шаблону, а Іван — ні.

Висновок

Ми торкнулися лише невеликої частини — основи регулярних виразів. Тема регулярок занадто велика, щоб розповісти про все в одній статті. Є інші селектори, модифікатори, та й самі регулярні вирази можуть бути складнішими та цікавішими.

💡 Щоб заглибитись у тему, пройдіть курс «Регулярні вирази для фронтенду». Він навчить вас складати регулярні висловлювання, щоб писати менше коду та працювати швидше.

Матеріали на тему

"Доктайп" - журнал про фронтенд. Читайте, слухайте та навчайтеся з нами.

Схожі статті

  • Навіщо потрібні вкладені класи C
  • Навіщо потрібні гідрогелеві маски
  • Навіщо потрібні каталоги в лайтрум
  • Навіщо потрібні гуси у селі
  • Навіщо потрібні гетери та сетери Java
  • Навіщо потрібні грилі на динаміки
  • Навіщо потрібні були руни
  • Навіщо потрібні мирові судді
  • Недавні статті

  • Як бродить зернова брага
  • Що робити якщо не засмагаєш на сонці чому засмага погано лягає на шкіру або перестає прилипати
  • Як швидко зняти гель лак без апарату
  • Як робиться Каті голови
  • Яка гребінець краще для об'єму
  • Чим роблять м'яку покрівлю
  • Чи можна залишати крем для обличчя на ніч
  • Де знаходиться датчик селектора
  • географія нашої діяльності
    вулиця Драгоманова, 27
    вул. Курчатова 1Б
    вул. Міцкевича 130
    вул. Лабунського, 1
    вул. Макарова-Пржевальського
    вул. Толстого 10
    вул. Грушевського 28
    вул. Перший промінь (Черняхівського)
    напишіть нам

    сообщение успешно отправлено
    x