Бен Форту. Регулярні вирази за 10 хвилин

  1. Урок 1. Знайомство з регулярними виразами
  2. Урок 2. Пошук окремих символів
  3. Урок З. Відповідність набору символів
  4. Урок 4. Використання метасимволов
  5. Урок 5. Повторення збігів
  6. Урок 6. Відповідність позицій
  7. Урок 7. Використання подвираженій
  8. Урок 8. Використання посилань назад
  9. Урок 9. Перегляд вперед і назад
  10. Урок 10. Вбудовані умови

Коли я працював у видавництві, то дуже активно користувався обробкою тексту за допомогою шаблонів. Тоді я працював у програмі PageMaker (нині InDesign), і використовував мову скриптів. Пізніше я переніс цей досвід на обробку тексту в Word і Excel, але використовував в макросах можливості, що надаються самими програмами (рис. 1). А зовсім недавно Андрій Макаренко опублікував замітку , Яка ніколи міць регулярних виразів VBA. Тому, коли я побачив, що видавництво Вільямс готує повторне видання книги для початківців в цій області, то вирішив вивчити предмет глибше. У книзі Бена Форту представлені всі найбільш важливі відомості про регулярні вирази: основні поняття і концепції, набори символів, метасимволу, повторювачі, пошук позиції, подвираженія, посилання назад, контекстний пошук. Книга написана доступною, простою мовою, і є відмінним введенням в предметну область.

Бен Форту. Регулярні вирази за 10 хвилин. - М .: Вільямс 2017 г. - 192 с.

Завантажити конспект (короткий зміст) в форматі Word або pdf

Купити книгу в Ozon або лабіринті

Купити книгу в   Ozon   або   лабіринті

Мал. 1. Використання спеціальних символів при пошуку і заміні в Word

Урок 1. Знайомство з регулярними виразами

Регулярні вирази - це рядки, які використовуються для пошуку і обробки тексту. Регулярні вирази записуються на мові регулярних виразів, тобто на спеціалізованій мові, розробленому і призначеному для вирішення завдань пошуку і заміни тексту. Для регулярних виразів немає ніякої особливої ​​програми; це не додаток, яке ви виконуєте, і не програмне забезпечення, яке ви можете купити або завантажити. Мова регулярних виразів реалізований у великій кількості програм. У деяких мовах програмування є функції або класи об'єктів, які експортують функціональні можливості регулярних виразів.

Щоб вам було легше засвоїти матеріал, ви можете завантажити додаток Regular Expression Tester (випробувач регулярних виразів) з Web-сторінки цієї книги.

Урок 2. Пошук окремих символів

Символ. (Точка) відповідає будь-якому символу. Щоб знайти точку використовуйте захист будь-якого спеціального символу - \ (похила риса вліво). Похила риса вліво \ - метасимвол - термін, що позначає символ зі спеціальним значенням, на відміну від звичайного символу. У регулярних виразах \ завжди використовується для того, щоб відзначити початок блоку з одного або декількох символів, які мають спеціальне значення. Якщо потрібно знайти похилу риску вліво \ (тобто виконати пошук \), використовуйте \\ (дві похилих риси вліво).

Урок З. Відповідність набору символів

Щоб знайти один з двох символів, наприклад, n або s, використовуйте набір символів, який визначається за допомогою метасимволов [і]. Символи [і] визначають набір символів, що складається з усіх символів між ними. Будь-член набору може відповідати символу, з яким він збігається (рис. 2).

Мал. 2. Відповідність одному з декількох символів

Що використовується тут регулярний вираз починається з [ns]; це відповідає або n, або s (але не з або будь-якого іншого символу). Символи [і] не відповідають ніяким символам - вони визначають набір. Літерал а відповідає а, точці. відповідає будь-який символ, похилій межах з точкою \. відповідає., а ЛІТЕРАЛЬ xls відповідає xls. Набори символів часто використовуються для виконання операцій пошуку (або визначення деяких частин), що не залежать від регістра (рис. 3). Використовуваний шаблон містить два набори символів: [Rr], якому відповідають символи R і r, і [Її], якому відповідають символи Е і е. Саме тому ми знайшли як RegEx, так і regex. Однак ланцюжок REGEX не була б знайдена.

Однак ланцюжок REGEX не була б знайдена

Мал. 3. Використання набору символів для пошуку, котрий залежить від регістра

При роботі з регулярними виразами часто доводиться визначати діапазони символів (від 0 до 9, від А до Z, і т.д.). Щоб спростити роботу з символьними діапазонами, в регулярних виразах для визначення діапазонів використовується спеціальний метасимвол: - (дефіс). При використанні діапазонів стежте, щоб кінець діапазону ні менше, ніж початок діапазону (діапазон типу [3-1] не допустимо). Така помилка часто робить непрацездатним весь шаблон. Дефіс (-) розглядається як спеціальний метасимвол тільки коли він використовується між [і]. Поза набору - є літералом і буде відповідати тільки -. Кілька діапазонів можна об'єднати в один набір. Наприклад, [A-Za-z0-9].

Іноді потрібно вказати відповідність з чим завгодно, крім того, що зазначено в списку шаблону. Почніть те, що вам не підходить метасимволом ^. Наприклад, шаблон [ns] а [^ 0-9] \. Xls знайде sam.xls, але не sa1.xls.

Урок 4. Використання метасимволов

Будь метасимвол можна захистити попередньої йому похилій рисою вліво.

Метасимволи відносяться до двох категорій: ті, які використовуються для пошуку тексту (вони відповідають шуканого тексту; до цього типу належить, наприклад, точка.), І ті, які використовуються як частина синтаксису регулярного виразу (до цього типу належать, наприклад, [і ]). Почнемо з метасимволов, відповідних пробільним символам (рис. 4).

4)

Мал. 4. Метасимволи, що позначають пробільні символи

Наступний блок тексту містить ряд записів в форматі з роздільниками-комами (часто цей формат називається CSV). Перед обробкою записів з даних потрібно видалити всі порожні рядки (рис. 5).

Мал. 5. Пошук порожніх рядків

Вираз \ r \ n відповідає комбінації перекладу рядка з перекладом каретки, використовуваної (в Windows) як маркер кінця рядка. Тому \ r \ n \ r \ n відповідає двом маркерами кінця рядка, тобто порожній рядку між двома записами.

Замість звичайно використовуваних наборів можуть використовуватися спеціальні метасимволи. Кажуть, що ці метасимволу відповідають класам символів (рис. 6, 7). Зверніть увагу, що синтаксис регулярних виразів чутливий до регістру. Метасимволи \ d і \ D мають різне значення. Також зверніть увагу, що класи POSIX самі по собі полягають в «дужки» [: і:]; тому, якщо класи POSIX використовувати всередині наборів, синтаксис буде включати подвійні дужки, наприклад [[: rxdigit:] [: rxdigit:]].

Мал. 6. Метасимволи класів символів

Мал. 7. Символьні класи POSIX

Урок 5. Повторення збігів

Щоб встановити відповідність символу (або набору) шаблону з одним або декількома символами, просто додайте в кінець шаблону символ + (рис. 8).

Мал. 8. Пошук відповідності з одним або декількома символами

Шаблон в точності відповідає всім трьом адресам. Регулярний вираз за допомогою \ w + спочатку знаходить один або кілька алфавітно-цифрових символів. Потім встановлюється відповідність з @, після чого знову використовується \ w +, щоб встановити відповідність з одним або декількома символами, такими за @. Потім встановлюється відповідність з точкою. (Використовується захищену точку \.) І ще один шаблон \ w +, щоб встановити відповідність з кінцем адреси.

Якщо потрібно встановити відповідність з необов'язковими символами, тобто з такими символами, використовуйте метасимвол *. Метасимвол * використовується в точності так, як +; він записується відразу після символу або набору і буде відповідати нулю або більшій кількості входжень символу або шаблону.

Знак питання ? відповідає тільки відсутності входжень або рівно одному входженню символу (або набору). Знак? дуже корисний тоді, коли потрібно встановити відповідність з одним конкретним необов'язковим символом в блоці тексту. Наприклад, якщо потрібно знайти адресу з http або https, використовуйте шаблон https?: // [\ w. /] +.

Щоб забезпечувати більшу свободу управління повторенням збігів, в регулярних виразах допускається використання інтервалів. Інтервали визначаються між символами {і}. Наприклад, {3} означає пошук відповідників з трьома екземплярами попереднього символу або набору. Щоб визначити діапазон кількості входжень (від мінімального до максимального значення кількості входжень шаблону), використовуйте наступний синтаксис {2,4}. Цей діапазон задає 2 в якості мінімального значення для кількості входжень шаблону і 4 - в якості максимального значення для кількості входжень шаблону.

Наприклад, для перевірки правильності формату дат, використовуйте шаблон \ d {1,2} [- \ /] \ d {1,2} [- \ /] \ d {2,4}. Шаблоном \ d {1,2} відповідає одна або дві цифри (така перевірка використовується для дня і місяця); \ D {2,4} відповідає році; а [- \ /] відповідає - або / як роздільник дати. В останньому наборі похила риса / захищена і записана як \ /. У багатьох реалізаціях регулярних виразів захист не потрібна, але деякі синтаксичні аналізатори регулярних виразів дійсно вимагають цього. Тому рекомендується завжди захищати похилу риску /.

Інтервали можуть починатися з 0. Інтервал {0,3} відповідає нулю, одному, двох або трьох входженням шаблону. Інтервали використовуються також для того, щоб визначити мінімальну кількість збігів з шаблоном, що не вказуючи при цьому максимального. Наприклад, {3}.

Обраний для такого прикладу текст є частиною Web-сторінки і містить текст з вбудованими HTML-тегами <В>. Регулярний вираз має знайти будь-який текст всередині тегів <В> (це може знадобитися при заміні форматування; рис. 9).

9)

Мал. 9. Щоб знайти текст всередині тегів

Причина того, що шаблон знайшов одне довге входження замість двох коротких, полягає в тому, що метасимволу типу * і + є жадібними; тобто вони шукають найдовше можливе відповідність, а не найменше. Рішення полягає в тому, щоб використовувати ледачі версії цих кванторів (вони називаються ледачими, тому що встановлюють відповідність з найменшим (а не найбільшим) можливою кількістю символів). Ледачі квантори визначаються шляхом додавання в кінець? до використовуваного квантору, причому для кожного з жадібних кванторів є ледачий еквівалент (рис. 10).

Мал. 10. Жадібні і ледачі квантори

Шаблон <[Вb]>. *? </ [Вb]> знайде в попередньому прикладі два збіги (рис. 11).

11)

Мал. 11. Щоб знайти текст всередині тегів за допомогою ледачого квантора

Урок 6. Відповідність позицій

Відповідність позицій дозволяє вказати, де в рядку тексту має відбутися збіг. Наприклад, якщо ви хочете замінити всі входження слова cat на слово dog, нудно враховувати кордону і використовувати спеціальні метасимволи для визначення позиції (або межі) перед шаблоном і після нього. Символ \ b вказує кордон слова. Таким чином, використовуйте регулярний вираз \ bcat \ b. Відповідно, шаблон \ bcat знайде все слова, що починаються з cat, а шаблон cat \ b - закінчуються на cat.

Насправді символ \ b не відповідає якому-небудь символу; він відповідає позиції. Тому довжина рядка, яка знаходиться шаблоном \ bcat \ b, дорівнює трьом (с, а й t), а не п'яти символам.

Щоб вказати щось, що не відповідає кордоні слова, використовуйте \ В.

Межі рядків використовуються для знаходження відповідностей з шаблонами на початку або наприкінці всього рядка. Метасимволи для кордонів рядків - дах ^ (початок рядка) і долар $ (кінець рядка). Зверніть увагу, що метасимвол ^ має кілька значень. Цей метасимвол заперечує набір, тільки якщо перебуває в наборі (тобто укладений у квадратні дужки [і]) і є першим символом після відкриває [. Поза набору ^ відповідає початку рядка.

У наступному прикладі необхідно перевірити, що відкриває XML-тег є першим текстом в рядку (рис. 12).

Мал. 12. Пошук рядка, що починається з XML-тега

Щоб не попастися в пастку жодного квантора, краще використовувати ^ \ s * <\? Xml. *? \?>

Знак $ використовується багато в чому аналогічним способом. Цей знак допомагає перевірити, що після закриває тега </ html> на Web-сторінці нічого немає: </ [Hh] [Tt] [Mm] [LI]> \ s * $. Набори використовуються для кожного з символів Н, Т, М і L (щоб обробити будь-яку комбінацію символів верхнього і нижнього регістрів), a \ s * $ відповідають будь-якому символ пробілу, за яким слід кінець рядка.

У багатьох реалізаціях регулярних виразів є спеціальні метасимволи, які змінюють поведінку інших метасимволов; один з них - (? m). Цей метасимвол допускає використання многострочного режиму. Складний режим змушує механізм регулярних виразів обробляти кінець рядка як роздільник рядків, і в цьому режимі ^ відповідає початку рядка або початку після кінця рядка (тобто початку нового рядка), а $ відповідає кінцю рядка або кінця після кінця рядка. Вираз (? M) не підтримує багатьма реалізаціями регулярних виразів.

Урок 7. Використання подвираженій

Подвираженія - частини більшого вираження; частини групуються так, щоб вони оброблялися як єдиний об'єкт. Подвираженія укладаються між символами (і). Наприклад, шаблон & nbsp; {2} знайде & nbsp ;;;;; але не & nbsp; & nbsp ;. Навпаки, (& nbsp;) {2} знайде & nbsp; & nbsp ;.

У наступному прикладі ми спробуємо знайти рік в запису про користувача (рис. 13).

13)

Мал. 13. Пошук на підставі угруповання виразів

Якщо оператор | помістити в підвираз, то він буде знати, що потрібно знайти один з варіантів в групі. Таким чином, шаблон (19 | 20) \ d {2} знайде 1967 і взагалі він відповідає будь-яким чотирьом цифрам, які починаються з 19 або 20.

Подвираженія можуть бути вкладені.

Урок 8. Використання посилань назад

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

Мал. 14. Пошук двох однакових слів поспіль за допомогою посилань назад

Вираз [] + відповідає одному або декільком прогалин, \ w + відповідає одному або декільком алфавітно-цифрових символів, а [] + відповідає будь-яким прогалин в кінці. Але зауважте, що шаблон \ w + укладений в круглі дужки, тому він є подвираженіем. Це підвираз використовується не для того, щоб знайти повторні збіги; ніяких символів повторення тут немає. Підвираз використовується для того, щоб згрупувати символи в один вираз, позначити його і ідентифікувати для використання в подальшому. Заключна частина цього шаблону \ 1; це і є посилання назад, на підвираз.

Термін «посилання назад» позначає об'єкт, який посилається назад на попередній вираз. Що ж в точності означає \ 1? Цей вислів відповідає першому подвираженія, використовуваному в шаблоні. Вираз \ 2 відповідає другому подвираженія, \ 3 - третій, і т.д. Посилання тому подібні змінним.

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

15)

Мал. 15. Пошук парних відкривають і закривають тегів за допомогою посилань назад

Були знайдені три збіги: одна пара <Н1> і дві пари <Н2>. Шаблон <[hH] ([1-6])> відповідає будь-якому відкриває тегу заголовка. Діапазон [1-6] укладений в дужки (і), тому він розглядається як підвираз. Отже, шаблон для закриває тега заголовка може назвати це підвираз як \ 1 в </ [hH] \ 1>. Підвираз ([1-6]) відповідає цифрам від 1 до б, і тому \ 1 відповідає тільки та ж сама цифра, яку знайшло це підвираз. З цієї причини <H2> This is not valid HTML </ H3> не відповідає шаблоном.

Посилання тому будуть працювати тільки в тому випадку, якщо вираз, на яке вони посилаються, є подвираженіем (і тому укладено в дужки). На жаль, синтаксис посилань назад дуже залежить від реалізації регулярних виразів в додатках. У деяких новіших реалізаціях регулярних виразів підтримується захоплення по іменах (named capture) -можливість, завдяки якій кожному подвираженія можна дати унікальну назву (ім'я); згодом ім'я може використовуватися для того, щоб звернутися до подвираженія (з цього імені, а не по його відносної позиції).

Виконання операцій заміни. Припустимо, потрібно зробити так, щоб по будь-якою адресою електронної пошти, зустрічається в тексті, можна було відправити лист. У HTML-документі ви б використовували тег <А HREF = «mailto: [email protected]»> user © address.соm / А>, щоб створити адресу електронної пошти, що активізується після клацання на ньому. Чи може регулярний вираз конвертувати (автоматично перетворити) адреса в тексті в формат адреси, який активізується після клацання на ньому? (Рис. 16).

Мал. 16. Пошук і заміна в електронній адресі

Посилання тому можуть містити шаблони, так що підвираз, знайдене в першому шаблоні, може використовуватися у другому шаблоні. (\ W + [\ w \.] * @ [\ W \.] + \. \ W +) -шаблон, який визначений як підвираз. Завдяки цьому знайдений текст може використовуватися в шаблоні заміни. В <А HREF = "mailto: \ 1"> \ 1 </ А> використовується знайдене підвираз двічі: один раз в атрибуті HREF (щоб визначити mailto :) і іншим разом в якості тексту, активизируемого одним помахом.

Розглянемо ще один приклад. Інформація про користувачів зберігається в базі даних, причому номери телефону зберігаються в форматі 313-555-1234. Необхідно переформатувати номера телефонів, щоб представити їх у вигляді (313) 555-1234 (рис. 17).

Мал. 17. Пошук і заміна формату номера телефону

Вирази (\ d {3}) (-) (\ d {3}) (-) (\ d {4}) відповідає номеру телефону, но розбіває его на п'ять подвіраженій (щоб найти его части). Ці п'ять частин можуть використовуватися незалежно, причому так, як необхідно, так що ($ 1) $ 3- $ 5 просто переформатує номер, використовуючи тільки три подвираженія і ігноруючи інші два. В результаті 313-555-1234 перетворюється в (313) 555-1234.

Заміна регістру. У деяких реалізаціях регулярних виразів можна виконувати перетворення за допомогою додаткових метасимволов (рис. 18).

Мал. 18. Метасимволи заміни регістра

Щоб змінити регістр наступного символу, \ l і \ u поміщаються перед символом (або виразом). Метасимволи \ L і \ U конвертують (перетворюють) регістр всіх символів, поки не зустрінеться метасимвол завершення цієї операції \ Е. Наприклад, текст всередині пари заголовних тегів рівня <Н1> перетворимо до верхнього регістру.

Текст: <H1> Welcome to my Homepage </ H1>

Регулярний вираз: (<[Hh] 1>) (. *?) (</ [Hh] 1>)

Заміна: $ 1 \ U $ 2 \ E $ 3

Результат: <H1> WELCOME TO MY HOMEPAGE </ H1>

Урок 9. Перегляд вперед і назад

Іноді потрібно створювати шаблон так, щоб він містив збіги, які не повертаються, іншими словами, збіги, які використовуються тільки для того, щоб правильно знайти місце розташування основного збіги, але самі допоміжні збіги не розглядаються як частини знайденого збіги. Синтаксично шаблон для перегляду вперед виглядає як підвираз, якому передує? =, А шуканий текст слід після знаку =.

Іноді в документації по регулярних виразах використовується термін споживати (consume) для позначення того, що буде знайдено і повернуто; про те ж, що було знайдено в результаті перегляду вперед, кажуть, що воно не споживається, не використовується (not consume).

Наступний текст містить список URL, і в кожному URL потрібно витягти частину, відповідну протоколу (можливо, щоб знати, як обробити ці URL; рис. 19).

Мал. 19. Перегляд вперед

У перерахованих URL протокол відділений від імені хоста двокрапкою:. Шаблон. + Відповідає будь-якого тексту (http в першому відповідно), а підвираз (? = :) відповідає:. Але зауважте, що це двокрапка: не було знайдено; ? = Вказує, що механізм регулярних виразів повинен встановити відповідність з двокрапкою: і в той же час не споживати (не використовувати) двокрапка.

Вираз. + (:) знаходить текст разом з двокрапкою:. Вираз. + (? = :) знаходить текст до двокрапки:.

Перегляд вперед шукає фрагмент, що знаходиться після повертається тексту. Перегляд назад шукає фрагмент, що передує поверненню тексту. Для позначення перегляду назад використовується оператор? <=.

Операції перегляду вперед і перегляду назад можуть використовуватися спільно (рис. 20).

Мал. 20. Спільне використання перегляду вперед і назад

Шаблон (? <= \ <[TT] [iI] [TТ] [lL] [eE]>) визначає операцію перегляду назад, яка встановлює відповідність з відкриває тегом заголовка <TITLE> (але не споживає його); подібним чином (? = \ </ [tT] [iI] [TТ] [lL] [eE]>) встановлює відповідність з закриває тегом заголовка </ TITLE>. Повертається тільки текст заголовка (оскільки це все, що було використано). Зверніть увагу, що знак <(перший символ, з яким встановлюється відповідність) захищений для того, щоб запобігти двозначність. Тому написано (? <= \ <, А не (? <= <.

Урок 10. Вбудовані умови

Обробка умовних виразів підтримується не всіма реалізаціями регулярних виразів. Умови в регулярних виразах визначаються за допомогою знака?. Фактично, ви вже зустрічали кілька дуже специфічних умов:

  • ? відповідає попередньому символу (або виразу), якщо він існує.
  • ? = І? <= Відповідають тексту попереду або позаду, якщо він існує.

Умова на засланні тому дозволяє використовувати вираз тільки в тому випадку, якщо попередній пошук подвираженія завершився успішно. Синтаксис для цього типу умови - (? {Посилання назад) істина).

Умови можуть також мати else -виражена, тобто вираження, які виконуються тільки в тому випадку, якщо посилання назад не існує (умова не виконується). Синтаксис для цієї форми умови - (? {Посилання назад) істина] брехня). У цьому синтаксисі передбачена умова, а також вираження істина і брехня, одне з них буде виконано, причому яке саме - залежить від того, чи виконано умову.

У Північній Америці прийнятними вважаються два формати для представлення номерів телефонів - (123) 456-7890 і 123-456-7890. А ось 1234567890, (123) -456-7890 і (123-456-7890 хоча і містять правильну кількість цифр, але відформатовані вкрай погано (рис. 21).

Мал. 21. Вбудовані умови

Вираз (\ ()? Перевіряє наявність відкриває дужок, але сама перевірка укладена в круглі дужки, щоб створити підвираз. Вираз \ d {3} відповідає 3-цифровому коду міста. Вираз (? (1) \) | -) відповідає або) або - в залежності від того, задоволено умова. Якщо (1) існує (це означає, що була знайдена відкриває дужка), то потрібно знайти і \); в іншому випадку потрібно знайти -. Завдяки цьому круглі дужки завжди повинні бути парними, а дефіс, що відокремлює код міста від номера, присутній тільки в тому випадку, якщо круглі дужки не використовуються.

Див. такоже Знайомство з регулярними виразами

Знак питання ?
Знак?
Наприклад, якщо потрібно знайти адресу з http або https, використовуйте шаблон https?
Ледачі квантори визначаються шляхом додавання в кінець?
Що ж в точності означає \ 1?
Чи може регулярний вираз конвертувати (автоматично перетворити) адреса в тексті в формат адреси, який активізується після клацання на ньому?
Синтаксично шаблон для перегляду вперед виглядає як підвираз, якому передує?
Але зауважте, що це двокрапка: не було знайдено; ?
Для позначення перегляду назад використовується оператор?
Умови в регулярних виразах визначаються за допомогою знака?

Дополнительная информация

rss
Карта