Статьи

OpenNET: стаття - Регулярні вирази в Perl (perl regex pcre)

  1. Регулярні вирази в Perl (perl regex pcre)

Регулярні вирази в Perl (perl regex pcre)


Ключові слова: perl , regex , pcre , ( знайти схожі документи )
From: ControlStyle, Микола Матковський < [email protected]. > Date: Sun, 24 Nov 2006 17:02:14 +0000 (UTC) Subject: Регулярні вирази в Perl Оригінал: http://www.pcre.ru/docs/perl/text/intro/ http://www.pcre.ru/docs/perl/text/fullintro/ Найчастіше регулярні вирази в Перл використовуються в операторах пошуку і заміни таких як s // m / операторах зв'язки = ~ або! = І т. Д. Як правило всі ці оператори мають схожі опції такі як: * i - Не будете звертати уваги рядкові і заголовні літери; * M - вважати рядок многострочной; * S - однорядкова рядок; * X - розширений синтаксис (використання прогалин і коментарів). Зазвичай всі ці опції позначають як '/ x'. Їх можна використовувати навіть всередині шаблонів використовую нову конструкцію (? ...). У шаблонах використовуються наступні метасимволи (символи позначають групи інших символів): * \ - вважати наступний метасимвол як звичайний символ; * ^ - початок рядка; *. - один довільний символ. Крім '\ n' - кінець рядка; * $ - кінець рядка; * | - альтернатива (або); * () - угруповання; * [] - клас символів. Метасимволи мають модифікатори (пишуться після метасимвола): * * - повторюється 0 або більше число разів; * + - повторюється 1 або більше число разів; *? - 1 або 0 раз; * {N} - точно n разів; * {N,} - щонайменше раз; * {N, m} - НЕ менше n, але і не більше m. У всі інші випадках фігурні дужки вважаються звичайними (регулярними) символами. Таким чином '*' еквівалентна {0,}, '+' - {1,} і '?' - {0,1}. n і m не можуть бути більше 65536. За замовчуванням дію метасимволов << жадібно >> (greedy). Збіг поширюється стільки раз скільки можливо без урахування результат дії следуюющіх метасимволов. Якщо ви хочете "зменшити їх апетит" то використовуйте символ '?'. Це не змінює значення метасимволов просто зменшує поширення. Таким чином: * *? - ��тане 0 і більше; * +? - 1 �� більше; * ?? - 0 або 1 раз; * {N}? - точно n разів; * {N,}? - не менш n раз; * {N, m}? - більше або дорівнює n і менше m разів. Шаблони працюють так само, як і подвійні лапки тому в них можна використовувати `\` - символи (бакслеш-символи): * \ t - символ табуляції; * \ N - новий рядок; * \ R - переклад каретки; * \ А - перевола формату; * \ V - вертикальна табуляція; * \ A - дзвінок; * \ E - escape; * \ 033 - восьмерична запис символу; * \ X1A - шістнадцяткова; * \ C [- control символ; * \ L - нижній регістр наступного символу; * \ U - великі букви наступного символу; * \ L - все символи в нижньому регістрі до \ E; * \ U - у верхньому регістрі до \ E; * \ E - обмежувач зміни регістру; * \ Q - скасування дії як метасимвола. Додатково в Perl додані наступні метасимволи: * \ w - алфавітно-цифровий або '_' символ; * \ W - НЕ алфавітно-цифровий або '_' символ; * \ S - один пробіл; * \ S - один не пробіл; * \ D - одна цифра; * \ D - одна не цифра. Зверніть увагу що все це << один >> символ. Для позначення послідовності застосовуйте модифікатори, наприклад: * \ w + - слово; * \ D + - ціле число; * [+ -]? \ D + - ціле зі знаком; * [+ -]? \ D + \.? \ D * - число з крапкою. Крім того існують уявні метасимволи. Позначають неіснуючі символи в місці зміни значення. Такі як: * \ b - межа слова; * \ B - не кордони слова; * \ A - початок рядка; * \ Z - кінець рядка; * \ G - кінець дії m // g. Кордон слова (\ b) - це уявна точка між символами \ w і \ W. Усередині класу символів '\ b' позначає символ backspace (стирання). Метасимволи \ A і \ Z - аналогічні '^' і '$' але якщо началострокі '^' і кінець рядка '$' діють для кожного рядка в многосторочной рядку, то \ A і \ Z позначають початок і кінець всієї многосторчной рядки. Якщо всередині шаблону застосовується угруповання (круглі дужки) то номер підрядка групи позначається як '\ цифра'. Зауважте що за шаблоном в межах вираження або блоку ці групи позначаються як '$ цифра'. Крім цього існують додаткові змінні: * $ + - позначає останній збіг; * $ & - все збіг; * $ `- все до збігу; * $ '- все після збігу. Приклад: $ s = "Один 1 два 2 і три 3"; if ($ s = ~ / (\ d +) \ D + (\ d +) /) {print "$ 1 \ n"; # Результат '1' print "$ 2 \ n"; # '2' print "$ + \ n"; # '2' print "$ & \ n"; # '1 два 2' print "$` \ n "; # 'Один' print "$ '\ n"; # 'І три 3'} Perl версії 5 містить додаткові конструкції шаблонів: * (? # Коментар) - коментар в тілі шаблону. * (?: Шаблон) - угруповання як і '()' але без зворотного посилання. * (? = Шаблон) - "заглядання" вперед. Наприклад / \ w + (? = \ T) / відповідає слову, за яким йде табуляція, але символ '\ t' не включається в результат. Приклад: $ s = "1 + 2-3 * 4"; if ($ s = ~ / (\ d) (? = -) /) # натхненням цифру за якою стоїть '-' {print "$ 1 \ n"; # Результат '2'} else {print "помилка пошуку \ n"; } (?! Шаблон) - "заглядання" вперед по запереченню. Приклад: $ s = "1 + 2-3 * 4"; if ($ s = ~ / (\ d) (?! \ +) /) # натхненням цифру за якою не варто '+' {print "$ 1 \ n"; # Результат '2'} else {print "помилка пошуку \ n"; } (? Ismx) - "внутрішні" модифікатори. Зручно застосовувати в шаблонах, де наприклад потрібно всередині шаблону вказати модифікатор. Правила регулярних виразів * Будь-який символ позначає себе самого якщо це не метасимвол. Якщо вам потрібно скасувати дію метасимвола то поставте перед ним '\'. * Рядок символів позначає рядок цих символів. * Безліч можливих символів (клас) полягає в квадратні дужки '[]' це значить що в даному місці може стояти один із зазначених у дужках символ. Якщо перший символ в дужках це '^' - значить не один із зазначених символів не може стояти в даному місці вираження. Усередині класу можна вживати символ '-' позначає диаппазон символів. Наприклад az один з малих букв латинського алфавіту, 0-9 - цифра і т.д. * Всі символи, включаючи спеціальні можна позначати за допомогою '\' як в мові С. * Альтернативні послідовності розділяються символом '|' Зауважте, що всередині квадратних дужок це звичайний символ. * Всередині регулярного виразу можна указиватся "подшаблони", укладаючи їх в крунлие дужки і посилатися на них як '\ номер' Перша дужка позначається як '\ 1'. ControlStyle, 15.05.2006. Регулярні вирази в Perl. Регулярні вирази використовуються для знаходження шаблонів у рядках. Наприклад, для того, щоб знайти в телефонній книзі конкретне ім'я, або, наприклад, всі імена, що починаються з літери 'a'. Робота з регулярними виразами є однією з найпотужніших і корисних, і в той же час найскладніших для розуміння особливостей Perl. Сподіваємося, що після прочитання цієї статті ви зрозумієте, наскільки це потужний і зручний інструмент. Отримавши певний досвід ви зможете використовувати ці можливості з великою користю для себе. Оператори Для роботи з регулярними виразами в Perl використовуються три оператора - оператор порівняння (matching - m //), оператор підстановки (substitution s ///) і оператор перекладу (translation - tr ///). Всі три оператора використовують змінну $ _ за замовчуванням, тому далі, поки не будуть представлені операції = ~ і! ~, Будемо користуватися нею. Оператор порівняння перевіряє, чи підходить перевіряється вираз під шаблон, і повертає значення 1, якщо це так, і значення 0 в іншому випадку. Запис цього оператора складається з букви m, роздільник (найчастіше це коса лінія - /, але в принципі це може бути майже будь-який символ), шаблону і ще одного роздільник (такого ж, як і перший :). Оператор порівняння $ _ =; if (m / hello /) {print "hello user \ n"; } If ($ input { 'siteurl'} = ~ #http: // #) {print $ input { 'siteurl'}; } У цьому прикладі перевіряється, чи є в рядку, отриманої з стандартного входу, слово 'hello'. Якщо це так (оператор m // поверне значення 1), то на стандартний вихід повернеться фраза 'hello user'. Примітка: взагалі-то символ 'm' є необов'язковим, тому оператор з цього прикладу може виглядати просто як / hello /. Оператор підстановки знаходить у рядку все підрядка, що задовольняють шаблону, і заміняє їх деяким іншим значенням. Запис цього оператора складається з букви s, що вказує на те, що це власне оператор підстановки і вихідного (що замінювати) і підстановлювальний (на що заміняти) шаблонів, розділених роздільниками. Оператор підстановки $ _ = 'My name is Fred'; # Oh no, my name is Jonathan! s / Fred / Jonathan /; У цьому прикладі в рядку $ _ всі слова Fred будуть змінені на Jonathan. Оператор перекладу також виробляє підстановку, але дещо іншого характеру - він використовується для заміни окремих символом деякими іншими (визначеними) символами. Синтаксис цього оператора схожий на синтаксис оператора підстановки, з тією відмінністю, що по-перше він очевидно починається з літер tr, а між роздільниками вставляються НЕ шаблони, а групи символів, перша - вихідні символи, друга - підстановочні, причому відповідні символи повинні стояти на однакових позиціях у своїх групах - якщо ви хочете замінити, наприклад латинську 'm' на кириличну 'м', вони повинні стояти на однакових місцях: 'm' - в першій групі символів, 'м' - у другій. Оператор переказу $ _ = 'hi.there, my.name.is.jonathan,'; tr /.,/! /; У цьому прикладі всі коми будуть змінені на знаки оклику, а точки - на прогалини. Модифікатори Можливості кожного з цих операторів можна розширити за допомогою модифікаторів. Модифікатори - це грубо кажучи символи які дописують до оператора (наприклад, так - s / fred / Jonathan / i), говорячи про те, як йому потрібно розбирати робоче значення. Модифікатори для оператора порівняння: * g - знаходить всі знайдені підрядка; * I - ігнорує регістр символів в рядку; * M - розглядає рядок як багаторядкових значення; * S - розглядає рядок як однострочое значення; * X - дозволяє використовувати розширені регулярні вирази; Модифікатори для оператора підстановки: * e - обчислює вирази групових перед підстановкою; * G - знаходить всі знайдені підрядка; * I - ігнорує регістр символів в рядку; * M - розглядає рядок як багаторядкових значення; * S - розглядає рядок як однострочое значення; * X - дозволяє використовувати розширені регулярні вирази. Модифікатори $ _ = 'My name is Fred'; s / fred / Jonathan / i; # My name is Jonathan s / jonathan / routine () / ie; # My name is [something] Операції = ~ і! ~ Операції = ~ і! ~ Дозволяють використовувати з операторами m //, s /// і tr /// будь змінні, а не тільки $ _, яка використовується цими операторами по замовчуванням. Оператор = ~ виконує ті ж функції, що і оператор присвоювання '=' (в разі використання з операторами s /// і tr ///) та оператор порівняння 'eq' (при використанні з оператором m //). Операція = ~ $ name = 'my name is Fred'; $ Name = ~ s / fred / Jonathan / ig; $ String = 'hello world'; if ($ string = ~ / hello / i) {print 'helloworlded in this string.'; } Аналогічно, операція! ~ Використовується так само як і операція 'ne' (її написання подібно операції чисельного порівняння! =), Використовується тільки з оператором порівняння і означає заперечення задоволення шаблоном. Операція! ~ $ String = 'good'; if ($ string! ~ / bad /) {print "hey, it's not too bad yet!"; } Пам'ять І наостанок - про можливості більш зручно працювати з результатами обробки регулярних виразів, а саме про зберіганні їх в окремих змінних. Такими змінними є зумовлені $ &, $ `, $ ', і набір змінних $ 1, $ 2, ..., $ 9. Змінна $ & Ця змінна призначена для зберігання фрагмента рядка, який задовольнив шаблону, заданому регулярним виразом. Це зручно в таких випадках, як, наприклад, якщо потрібно знайти число в рядку, але невідомо, що це за число. Ось як це може виглядати: $ string = "error 404." $ String = ~ m / \ d + /; $ Number = $ &; # $ Number містить "404" Змінні $ `и $ 'Ці змінні служать для зберігання фрагментів, які не задовольнили шаблоном, а саме подстрок, які стоять до і після результату відповідно. Іншими словами, після операції, наприклад, порівняння, значення виходячи рядки розділяється на три частини - частина, яка підійшла під шаблон, і фрагменти, які йдуть перед нею і після неї. Ці частини і поміщаються в змінні $ &, $ `и $ 'відповідно. (Зверніть увагу на те, що в першій змінної - зворотна лапки, а в другій - пряма). Подивимося на попередній приклад. $ String = "error 404." $ String = ~ m / \ d + /; $ Number = $ &; # $ Number містить "404" $ before = $ `; # $ Before містить "error" $ after = $ '; # $ After містить "." Змінні $ 1 .. $ 9 Ці змінні служать для зберігання фрагментів рядка, які задовольнили відповідним певним фрагментам шаблону. У шаблоні фрагменти виділяються за допомогою дужок. Кожному фрагменту виділяється номер в тому порядку, в якому вони розташовані, і відповідна змінна буде містити його значення. $ String = "this is to be uppercased"; $ String = ~ s / (upper \ w +) / uc ($ 1) /; # $ String = "this is to be UPPERCASED" $ string = "15 apples, 2 foos, 3 bars"; while ($ string = ~ m / (\ d +) (\ w +) / g) {print "$ 2: $ 1 \ n"; } # Виведе apples: 15 # foos: 2 # bars: 3 Микола Матковський < [email protected]. >, 11.05.2006.

Обговорення [ RSS ]
  • 1 , Максим (??), 13:45, 01/04/2010 [ відповісти ]
+ / - Дякуємо! Оч. корисна добре написана стаття. За детальніше б про (?:).

У прикладі тобто не точність:
if ($ input { 'siteurl'} = ~ # http: // # ) {
print $ input { 'siteurl'};
}
регекспів варто було б записати з оператором "m" - m # http: // # . Інакше - це просто коментар.

  • 3 , Віктор (??), 16:31, 27/04/2011 [ відповісти ]
+ / - У статті помилка.

* ^ - початок рядка;
* $ - кінець рядка;

* \ A - початок рядка;
* \ Z - кінець рядка;

насправді ці символи роблять різні речі.

"Рядок" це LINE або STRING ??
Є різниця.


Додати коментар

Спонсори:

Хостинг:



Метасимволи мають модифікатори (пишуться після метасимвола): * * - повторюється 0 або більше число разів; * + - повторюється 1 або більше число разів; *?
Таким чином '*' еквівалентна {0,}, '+' - {1,} і '?
Якщо ви хочете "зменшити їх апетит" то використовуйте символ '?
Таким чином: * *?
?тане 0 і більше; * +?
? більше; * ?
Або 1 раз; * {N}?
Очно n разів; * {N,}?
Не менш n раз; * {N, m}?
Для позначення послідовності застосовуйте модифікатори, наприклад: * \ w + - слово; * \ D + - ціле число; * [+ -]?

Новости