Perl регулярні вирази, pc, programming
Регулярні вирази є зразками для пошуку заданих комбінацій символів у текстових рядках і заміни їх на інші комбінації символів (ці операції називаються відповідно зіставлення зі зразком і підстановка).
Регулярний вираз у мові PERL має вигляд
Тут pattern - це рядок, що задає регулярне вираження, а modifiers - необов'язкові однолітерні модифікатори, які уточнюють правила використання цього регулярного виразу.
Регулярний вираз може складатися із звичайних символів; у цьому випадку воно відповідатиме заданій комбінації символів у рядку. Наприклад, вираз /кат/ відповідає виділеним підрядкам у наступних рядках: "кат ок", "закат ", "укат ить". Однак справжню силу регулярним виразам мови PERL надає можливість використання в них спеціальних метасимволів.
Модифікатори
Різні операції з регулярними виразами використовують різні модифікатори для уточнення операції, що виконується. Однак чотири модифікатори мають загальне призначення.
Класи символів Unicode та POSIX
Ми можемо використовувати в регулярних виразах синтаксис
де class задає назву класу символів POSIX, тобто мобільного стандарту на мову C. При використанні директиви use utf8 замість класів POSIX можна використовувати класи символів Unicode у конструкції
У наступній таблиці зведено всі класи символів POSIX, відповідні класи символів Unicode та метасимволи, якщо вони є.
Наприклад, десяткове число можна задати будь-яким із наступних трьох способів:
Для вказівки того, що символ не належить до заданого класу, використовуються конструкції
Наприклад, такі висловлювання мають однаковий зміст:
Запам'ятовування підрядків
Використаннякруглих дужок у регулярному вираженні призводить до того, що підрядок, що відповідає зразку в дужках, запам'ятовується у спеціальному буфері. Для доступу до n-ної запам'ятованої підрядки всередині регулярного виразу використовується конструкція \n, а поза ним - $n, де n може приймати будь-які значення, починаючи з 1. Однак, слід пам'ятати, що PERL використовує вирази \10, \11 і т д. як синоніми для вісімкових кодів символів \010, \011 і т. д. Неоднозначність тут дозволяється так. Символ \10 вважається зверненням до 10-го запам'ятованого підрядку, якщо перед ним у регулярному вираженні стоїть не менше десяти лівих круглих дужок; інакше, це символ із вісімковим кодом 10. Метасимволи \1, … \9 завжди вважаються зверненнями до запам'ятовуваних підрядків. Приклади:
Крім змінних $1, $2, … є ще кілька спеціальних змінних, у яких зберігаються результати останньої операції з регулярним виразом, а саме:
Всі ці спеціальні змінні зберігають свої значення до кінця об'ємного блоку або до наступного успішного зіставлення зі зразком.
Розширені зразки
PERL містить кілька додаткових конструкцій, які можна використовувати у регулярних висловлюваннях розширення їх можливостей. Всі ці конструкції полягають у круглі дужки та починаються із символу ?, що відрізняє їх від запам'ятовування підрядків.
(?#text) Коментар. Уся конструкція ігнорується.(?modifiers-modifiers) Вмикає або вимикає задані модифікатори. Модифікатори, що стоять до символу, включаються, стоять після нього - вимикаються. Приклад:
if (/aaa/) < … ># зіставлення з урахуванням регістру if (/(?i)aaa/) < … ># зіставлення без урахування регістру
(?:pattern)(?modifiers-modifiers:pattern) Дозволяєгрупувати вирази регулярного вираження без запам'ятовування знайденої відповідності. Друга форма додатково включає чи вимикає задані модифікатори. Наприклад, вираз /ко(?:тшка)/ - це короткий запис виразу /коткошка/ .(?=pattern) Відповідність із загляданням уперед без запам'ятовування знайденої відповідності. Наприклад, вираз /Windows (?=9598NT2000)/ відповідає "Windows" у рядку "Windows 98", але не відповідає у рядку "Windows 3.1". Після зіставлення пошук триває з позиції, що йде за знайденим відповідністю, не враховуючи заглядання вперед.(?!pattern) Невідповідність із загляданням уперед без запам'ятовування знайденої відповідності. Наприклад, вираз /Windows (?!9598NT2000)/ відповідає "Windows" у рядку "Windows 3.1", але не відповідає у рядку "Windows 98". Після зіставлення пошук триває з позиції, що йде за знайденим відповідністю, не враховуючи заглядання вперед.(? Відповідність із загляданням назад без запам'ятовування знайденої відповідності. Наприклад, вираз /(? відповідає слову, що йде за символом табуляції, і символ табуляції не включається до $&. Фрагмент, що відповідає загляданню назад, повинен мати фіксовану ширину.(? Невідповідність із загляданням назад без запам'ятовування знайденої відповідності. Наприклад, вираз /(? відповідає слову, перед яким немає символу табуляції. Фрагмент, що відповідає загляданню назад, повинен мати фіксовану ширину.
Операції з регулярними виразами
До цього часу ми укладали регулярні висловлювання символи //. Насправді символи-обмежувачі регулярного виразу визначаються операцією q, яку ми до них застосовуємо. У цьому розділі детально описано всі операції мови PERL з регулярними виразами.
Зіставлення зі зразком
Ця операція зіставляє заданий рядок із зразком pattern і повертає істину чи брехню залежно від результату зіставлення. Порівняний рядок задається лівим операндом операції =
Якщо рядок не заданий, то відбувається зіставлення зі змістом спеціальної змінної $_. Зокрема, попередній приклад можна переписати так:
Крім стандартних, тут можна використовувати такі модифікатори: