Advertisement
  1. Code
  2. Web Development

8 регулярних виразів, які ви повинні знати

Scroll to top
Read Time: 8 min

() translation by (you can also view the original English article)

Регулярні вирази - це власна мова.  Коли ви вивчаєте нову мову програмування, вони - маленький суб'язик, на перший погляд, не має сенсу.  Вам потрібно прочитати не один підручник, статтю або книгу, щоб зрозуміти опис «простого» шаблону.  Сьогодні ми розглянемо вісім регулярних виразів, які ви повинні знати для свого наступного проекту кодування.

Перш ніж почати, ви можете перевірити деякі з regex apps на Envato Market, таких як RegEx Extractor.

Ви можете отримувати електронні листи, проксі, IP-адреси, номери телефонів, адреси, теги HTML, URL-адреси, посилання, дати і т. д.  Просто вставте одне або кілька регулярних виразів і джерел URL-адрес і запустіть процес.

Витяг, очищення, аналіз, збір.

Приклади використання

  • Витяг листів зі старої адресної книги CSV.
  • Витяг джерел зображення з файлів HTML.
  • Витягти проксі з інтернет-сайтів.
  • Витяг URL з результатів пошуку Google.

Довідкова інформація про Regular Expressions

Ось що Вікіпедія говорить:

У програмуванні регулярні вирази надають стислий і гнучкий засіб для ідентифікації рядків тексту, таких як конкретні символи, слова або шаблони символів.  Регулярні вирази (скорочено regex або regexp з множинними формами regexps або regexen) записуються на офіційній мові, який може бути інтерпретований процесором регулярних виразів, програмою, яка або служить генератором parser, або аналізує текст і ідентифікує частини, які відповідають наданої специфікації.

Це нічого не говорить мені про фактичні зразки.  Регулярні вирази, які я буду обговорювати сьогодні, містять такі символи, як \ w, \ s, \ 1 і багато інших, які ні на що інше не схожі.

Якщо ви хочете більше дізнатись про регулярні вирази, перш ніж продовжувати читати цю статтю, я запропонував би подивитися серію Regular Expressions for Dummies.

Вісім регулярних виразів, які ми будемо обговорювати сьогодні, дозволять вам порівняти a (n): username, password, email, hex value (#fff або # 000), slug, URL, IP address і HTML tag.  Ближче до кінця списку регулярні вирази стають все більш заплутаними.  Зображення для regex на початку зрозумілі, але останні чотири легше зрозуміти, прочитавши пояснення.

Головне, що потрібно пам'ятати про регулярні вирази, - це те, що вони майже однаково читаються вперед і назад.  У цьому реченні більше сенсу, коли ми говоримо про збіг тегів HTML.

Примітка: Обмежувачами, використовуваними в регулярних виразах, є косі риси, «/».  Кожен шаблон починається і закінчується роздільником.  Якщо пряма коса риска з'являється в regex, ми повинні прибрати її зворотною косою: «\ /».


1. Відповідність імені користувача

Matching a usernameMatching a usernameMatching a username

Шаблон:

1
    /^[a-z0-9_-]{3,16}$/
2
  

Опис:

Спочатку ми просимо parser знайти початок рядка (^), за якою слідують будь-яка буква в нижньому регістрі (a-z), номер (0-9), символ підкреслення або дефіс.  Далі {3,16} засвідчується, що по крайній мірі 3 з цих символів, але не більше 16.  Нарешті, нам потрібен кінець рядка ($).

Рядок, який відповідає:

my-us3r_n4m3

Рядок, який не відповідає:

th1s1s-wayt00_l0ngt0beausername (занадто довга)


2. Перевірка пароля

Matching a passwordMatching a passwordMatching a password

Шаблон:

1
    /^[a-z0-9_-]{6,18}$/
2
  

Опис:

Перевірка пароля дуже схожа на перевірку імені користувача.  Єдина відмінність полягає в тому, що замість 3-16 букв, цифр, підкреслення або дефісів нам потрібно від 6 до 18 ({6,18}).

Рядок, який відповідає:

myp4ssw0rd

Рядок, який не відповідає:

mypa $$ w0rd (знак долара зайвий)


3. Узгодження 

Matching a hex valudMatching a hex valudMatching a hex valud

Шаблон:

1
    /^#?([a-f0-9]{6}|[a-f0-9]{3})$/
2
  

Опис:

Почнемо з вказівки parser знайти початок рядка (^).  Потім знак числа є необов'язковим, оскільки за ним слід знак питання.  Знак питання говорить parser, що попередній символ - в даному випадку знак числа - є необов'язковим, але щоб був «жадібним» і відзначив його, якщо він є. Далі, всередині першої групи (перша група круглих дужок) ми можемо мати дві різні ситуації.  Перша - будь-яка буква в нижньому регістрі між a і f або число шість разів.  Вертикальна смуга говорить нам, що ми можемо також мати три малі літери між a і f або номерами.  Нарешті, нам потрібен кінець рядка ($).

Причина, по якій я ставив шість символів перед цим, полягає в тому, що parser запише значення hex value типу #ffffff.  Якби я перевернув його так, щоб три символи стали першими, parser міг би отримати тільки #fff, а не інші три f.

Рядок, який відповідає:

# a3c113

Рядок, який не відповідає:

# 4d82h4 (містить букву h)


4. Перевірка Slug

Matching a slugMatching a slugMatching a slug

Шаблон:

1
    /^[a-z0-9-]+$/
2
  

Опис:

Ви будете використовувати це регулярний вираз, якщо вам коли-небудь доведеться працювати з mod_rewrite і красивими URL.  Спочатку ми попросимо parser знайти початок рядка (^), за нею йдуть одна або кілька (плюс знак) букв, цифри або дефіси.  Нарешті, нам потрібно закінчення рядка ($).

Рядок, який відповідає:

my-title-here

Рядок, який не відповідає:

my_title_here (містить нижній дефіс):


5. Перевірка Email

Matching an emailMatching an emailMatching an email

Шаблон:

1
    /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/
2
  

Опис:

Почнемо з вказівки parser знайти початок рядка (^).  Всередині першої групи ми зіставляємо одну або кілька малих літер, цифр, символів підкреслення, точок або дефісів.  Я прибрав точки, тому що відкрита точка означає будь-який символ.  Відразу після цього повинен бути знак «at».  Далі слід ім'я домену, яке повинно бути: одна або кілька малих літер, цифр, символів підкреслення, точок або дефісів.  Потім (екранована) точка, з розширенням від двох до шести букв або точок.  У мене від 2 до 6 через специфічні для країни TLD (.ny.us або .co.uk).  У фіналі нам потрібен кінець рядка ($).

Рядок, який відповідає:

john@doe.com

Рядок, який не відповідає:

john@doe.something (TLD довжини)


6. Перевірка URL

Matching a urlMatching a urlMatching a url

Шаблон:

1
    /^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/
2
  

Опис:

Це regex майже підходить до завершальної частини вищезгаданого регулярного виразу, зібравши його між "http: //" і деякою структурою файлу в кінці.  Це звучить набагато простіше, ніж є насправді.  Для початку ми шукаємо початок рядка за допомогою каретки.

Перша група охоплення - це все опції.  Він дозволяє URL-адресі починатися з «http: //», «https: //» або без них.  У мене знак питання після s, щоб дозволити URL-адреси з http або https.  Щоб зробити всю цю групу необов'язковою, я просто додав знак питання до її кінця.

Далі йде доменне ім'я: одне або кілька чисел, букв, точок або дефісів, за якими слід інша точка, потім від двох до шести букв або точок.  Наступний розділ - це необов'язкові файли і каталоги.  Усередині групи ми хочемо порівняти будь-яку кількість косою риси, літери, цифри, символи підкреслення, прогалини, точки або дефіси.  Потім ми говоримо, що цю групу можна зіставляти стільки раз, скільки ми хочемо.  В значній мірі це дозволяє поєднати кілька каталогів разом з файлом у кінці.  Я використовував зірку замість знаку питання, тому що зірка говорить нуль або більше, а не нуль або один.  Якби в ньому використовувався знак питання, міг бути зіставлений тільки один файл / каталог.

Потім завершальна коса риска зіставляється, але вона може бути необов'язковою.  Нарешті, ми закінчуємо з кінцем рядка.

Рядок, який відповідає:

https://net.tutsplus.com/about

Рядок, який не відповідає:

http://google.com/some/file!.html (містить знак оклику)


7. Перевірка IP Address

Matching an IP addressMatching an IP addressMatching an IP address

Шаблон:

1
    /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/
2
  

Опис:

Не буду брехати, я не писав цей регулярний вираз; я отримав це here.  Це не означає, що я не можу розібрати його на частини.

Перша група захоплення дійсно не є захопленої групою, тому що

1
    ?:
2
  

була поміщена всередину, що говорить parser не захоплював цю групу (докладніше про це в останньому regex).  Ми також хочемо, щоб цю незахваченную групу повторювали три рази - {3} в кінці групи.  Ця група містить іншу групу, підгрупу і точку.  Парсер шукає збіг в підгрупі, потім точку, щоб рухатися далі.

Підгрупа є іншою не захопленої групою.  Це всього лише набір символів (щось всередині дужок): рядок «25», за якою слідує число від 0 до 5; або рядок «2» і число від 0 до 4 і будь-яке число; або нуль або один, супроводжуваний двома числами, при цьому друге є необов'язковим.

Після того, як ми зіставимо три з них, ми переходимо до наступної не захопленої групі.  Цією потрібно: рядок «25», за якою слідує число від 0 до 5; або рядок «2» з числом від 0 до 4 і іншим номером в кінці; або нуль або один, супроводжуваний двома числами, при цьому друге є необов'язковим.

Ми закінчуємо цю заплутаний регулярний вираз з кінцем рядка.

Рядок, який відповідає:

73.60.124.136 (це не мій IP address: P)

Рядок, який не відповідає:

256.60.124.136 (перша група повинна бути «25», а числа від нуля до п'яти)


8. Перевірка тега HTML

Matching an HTML tagMatching an HTML tagMatching an HTML tag

Шаблон:

1
    /^<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)$/
2
  

Опис:

Одне з найбільш корисних regexes в списку.  Він відповідає будь-якому тегу HTML з вмістом всередині.  Як завжди, беремо початок рядка.

Спочатку з'являється ім'я тега.  Це повинна бути одна або кілька букв.  Це перша група захоплення, вона дуже корисна, коли нам потрібно взяти закривающийся тег.  Наступне - атрибути тега.  Це символ більше (>).  Оскільки це необов'язково, але я хочу, щоб вони збігалися з більш ніж одним символом, використовується зірка.  Знак плюс становить атрибут і значення, а зірка говорить стільки атрибутів, скільки ви хочете.

Потім йде третя група без захоплення.  Всередині він буде містити або знак більше, деякий контент і закриває тег; або прогалини, пряма коса риска і знак більше.  Перша опція шукає знак більше, ніж будь-яку кількість символів, і закриває тег.  \ 1 який представляє вміст, який був захоплено в першій групі. В даному випадку це ім'я тега.  Тепер, якщо це неможливо зіставити, ми хочемо знайти самозакривний тег (наприклад, тег img, br або hr).  Це повинно мати один або кілька пробілів, за якими слід «/>».

Регулярний вираз закінчується кінцем рядка.

Рядок, який відповідає:

Nettuts "> http://net.tutsplus.com/"> Nettuts +

Рядок, який не відповідає: 

<img src="img.jpg" alt="My image>" /> (атрибут не повинен містити знака більше)


Висновок

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

Слідуйте за нами на Twitter або підпишіться на NETTUTS RSS Feed, щоб дізнаватися про щоденні уроках і статтях в Інтернеті.  Деякі з них шукайте по regex apps на Envato Market.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.