русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Метасимволи


Дата додавання: 2015-01-08; переглядів: 1450.


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

Наприклад, регулярний вираз для пошуку в тексті фрагмента “Вася” записується за допомогою чотирьох звичайних символів Вася, а вираз для пошуку двох цифр, що йдуть підряд, складається з двох метасимволів \d\d.

За допомогою комбінацій метасимволів можна описувати складні шаблони для пошуку. Наприклад, можна описати шаблон для IP-адреси, адреси електронної пошти, різних форматів дати, заголовків певного вигляду і так далі.

У таблиці 14.2 описані найбільш споживані метасимволи, що є класами символів.

Метасимволи, перераховані в таблиці 14.3, уточнюють позицію в рядку, в якому слід шукати збіг з регулярним виразом, наприклад, тільки на початку або в кінці рядка. Ці метасимволи є уявними, тобто в тексті їм не відповідає ніякий реальний символ.

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

 

Таблиця 14.2

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

 

Клас символів Опис Приклад
. Будь-який символ, окрім \n Вираз с.t відповідає фрагментам cat, cut, clt.
[ ] Будь-який одиночний символ з послідовності, записаної усередині дужок. Допускається використання діапазонів символів Вираз c[aul]t відповідає фрагментам cat, cut і clt, а вираз с[a-z]t - фрагментам cat, cbt, cct, cdt,…, czt
[^] Будь-який одиночний символ, що не входить в послідовність, записану усередині дужок. Допускається використання діапазонів символів Вираз c[^aul]t відповідає фрагментам cbt, c2t, cXt и т. д., а выражение c[^a-zA-Z]t - фрагментам c1t, cCt і т.д.
\w Будь-який алфавітно-цифровий символ, тобто символ з множини прописних і рядкових букв і десяткових цифр Вираз c\wt відповідає фрагментам cat, cut, clt, /0t і т.д., але не відповідає фрагментам c{t, c;t і т.д.
\W Будь-який не алфавітно-цифровий символ, тобто символ, що не входить в множину прописних і рядкових букв і десяткових цифр Вираз c\Wt відповідає фрагментам c{t, c;t, c t і т. д., але не відповідає фрагментам cat, cut, clt і т.д.  
\s Будь-який пробільний символ, наприклад символ пробілу, табуляції (\t., \v), перекладу рядка (\n \r), нової сторінки (\f)   Вираз \s\w\w\w\s відповідає будь-якому слову з трьох букв, оточеному пробільними символами
\S Будь-який не пробільний символ, тобто символ, що не входить в множину пробільних Вираз \s\S\S\s відповідає будь-яким двом непробільним символам, оточеним пробільними
\d Будь-яка десяткова цифра Вираз c\dt відповідає фрагментам c1t, c2t,c9t
\D Будь-який символ, що не є десятковою цифрою Вираз C\Dt не відповідає фрагментам c1t, c2t, …, c9t

 

 

Таблиця 14.3

Уточнюючі метасимволи

 

Метасимвол Опис
^ Фрагмент, співпадаючий з регулярним виразом, слід шукати тільки на початку рядка
$ Фрагмент, співпадаючий з регулярним виразом, слід шукати тільки в кінці рядка
Фрагмент, співпадаючий з регулярним виразом, слід шукати тільки на початку багаторядкового рядка
\Z Фрагмент, співпадаючий з регулярним виразом, слід шукати тільки в кінці багаторядкового рядка
\b Фрагмент, співпадаючий з регулярним виразом, починається або закінчується на границі слова (тобто між символами, відповідними метасимволам \w і \W )
\B Фрагмент, співпадаючий з регулярним виразом, не повинен зустрічатися на границі слова
     

 

У регулярних виразах часто використовують повторення. Повторення - це метасимволи, які розташовуються безпосередньо після звичайного символу або класу символів і задають кількість його повторень у виразі. Наприклад, якщо потрібно записати вираз для пошуку в тексті п'яти що йдуть підряд цифр, замість метасимволів \d\d\d\d\d можна записати \d{5}. Такому виразу відповідатимуть фрагменти 11111, 12345, 53332 і так далі

Найбільш вживані повторення перераховані в таблиці 14.4.

Таблиця 14.4

Повторення

 

Метасимвол Опис Приклад
* Нуль або більш за повторення попереднього елементу Вираз ca*t відповідає фрагментам ct, cat, caat, caaaaaaaaaaat і так далі
+ Одне або більш за повторення попереднього елементу Вираз ca+t відповідає фрагментам cat, caat, caaaaaaaaaaat і так далі  
? Жодного або одне повторення попереднього елементу Вираз ca?t відповідає фрагментам ct і cat
{n} Рівно n повторень попереднього елементу Вираз ca{3}t відповідає фрагменту caaat, а вираз (cat){2} - фрагменту catcat
{n.} Принаймні n повторень попереднього елементу Вираз са {3}t відповідає фрагментам caaat, caaaat, caaaaaaaaaaaat і так далі
{n, m} Від n до m повторень попереднього елементу Вираз ca{2,4}t відповідає фрагментам caat, caaat і caaaat

Окрім розглянутих елементів регулярних виразів можна використовувати конструкцію вибору з декількох елементів. Варіанти вибору перераховуються через вертикальну межу. Наприклад, якщо потрібно визначити, чи присутній в тексті хоч би один елемент із списку “cat”, “dog” і “horse”, можна використовувати вираз

 

cat|dog|horse

 

При пошуку використовується так званий «ледачий» алгоритм, по якому пошук припиняється при знаходженні найкоротшого з можливих фрагментів, співпадаючих з регулярним виразом.

Приклади простих регулярних виразів:

 

ціле число (можливо, із знаком):

[-+]?\d+

дійсне число (може мати знак і дробову частину, відокремлену крапкою):

[-+]?\d+\.?\d*

російський номер автомобіля (спрощено):

[A-Z]\d{3}[A-Z]{2}\d\dRUS

 

Якщо потрібно описати у виразі звичайний символ, співпадаючий з яким-небудь метасимволом, перед ним стоїть символ “\”. Так, для пошуку в тексті символу крапки слід записати \., а для пошуку косої межі - \\. Наприклад, для пошуку в тексті імені файлу cat.doc слід використовувати регулярний вираз cat\.doc.

Для групування елементів виразу використовуються круглі дужки. Групування застосовується у багатьох випадках, наприклад, якщо потрібно задати повторення не для окремого символу, а для послідовності. Крім того, групування служить для запам'ятовування в деякій змінній фрагмента тексту, що збігся з виразом, взятим в дужки. Ім'я змінної задається в кутових дужках або апострофах:

 

(?<ім'я_змінної> фрагмент_виразу

 

Фрагмент тексту, що збігся при пошуку з фрагментом регулярного виразу, заноситься в змінну із заданим ім'ям. Нехай, наприклад, потрібно виділити з тексту номери телефонів, записаних у вигляді nnn-nn-nn. Регулярний вираз для пошуку номера можна записати так:

 

(?<num>\d\d\d-\d\d-\d\d)

 

При аналізі тексту в змінну з ім'ям num послідовно записуватимуться знайдені номери телефонів.

Розглянемо ще один варіант застосування групування - для формування зворотних посилань. Всі конструкції, взяті в круглі дужки, автоматично нумеруються, починаючи з 1. Ці номери можна використовувати для посилань на відповідну конструкцію. Наприклад, вираз (\w)\1 використовується для пошуку здвоєних символів в словах (wall, mass, cooperate).

Круглі дужки можуть бути вкладеними, при цьому номер конструкції визначається порядком відкриваючої дужки у виразі. Приклади:

 

(Вася)\s+( дасть)\s+(?<sum>\d+)\sкрб\.\s+ Ну що ж ти. \1

У цьому виразі три під вирази взяті в дужки. Посилання на перше з них виконується в кінці виразу. З цим виразом співпадуть, наприклад, фрагменти

Вася дасть 5 крб. Ну що ж ти, Вася

Вася дасть 54356 крб. Ну що ж ти, Вася

 

Вираз, що задає IP-адресу:

 

((\d{1.3}\.){3}\d{1.3})

 

Адреса складається з чотирьох груп цифр, розділених крапками. Кожна група може включати від однієї до трьох цифр. Приклади IP-адрес: 212.46.197.69, 212.194.5.106, 209.122.173.160. Перша група, взята в дужки задає всю адресу. Їй привласнюється номер 1. У неї вкладені другі дужки, що визначають межі для повторення {3}.

Змінну, ім'я якої задається усередині виразу в кутових дужках, також можна використовувати для зворотних посилань в подальшій частині виразу. Наприклад, пошук подвійних символів в словах можна виконати за допомогою виразу (?<s>\w)\k<s>, де s - ім'я змінної, в якій запам'ятовується символ \k - елемент синтаксису.

У регулярний вираз можна поміщати коментарі. Оскільки вирази зазвичай простіше писати, чим читати, це - дуже корисна можливість. Коментар або поміщається всередину конструкції (?# ), або розташовується, починаючи від символу # до кінця рядка.

 


<== попередня лекція | наступна лекція ==>
Операції з вказівками | З регулярними виразами


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн