НАЗВА

perlre - регулярні вирази Perl

ОПИС

Ця сторінка описує синтаксис регулярних виразів Perl.

Якщо ви досі не використовували регулярних виразів, то можете почати зі швидкого ознайомлення з ними в perlrequick(1), і довшого ввідного посібника perlretut(1).

Для довідки щодо того, як регулярні вирази застосовуються в операціях зіставляння, а також задля різноманітних прикладів, под ивіться обговорення "m//", "s///", "qr//" і "??" розділу "Оператори типу залапковування регулярних виразів" сторінки ?perlop(1).

Оператори зіставляння можуть включати різноманітні модифікатори. Модифікатори, котрі стосуються інтерпретації регулярних вира зів усередині перелічено нижче. Ті з них, що змінюють спосіб в який Perl розглядає регулярні вирази, описано в розділі "Опера тори типу залапковування регулярних виразів" сторінки ?perlop(1) і "Жахливі подробиці щодо обробки залапкованих конструкцій" там же.

i : Нечутливе до регістру порівняння зі зразком.

Якщо діє прагма "use locale", мапа регістрів відповідатиме з поточній локалі. Дивіться ?perllocale (1).

m : Розглянути ланцюжок як такий, що складається з багатьох рядків. Тобто, змінити "^" і "$" таким чином, щоб замість того, щоб вказувати початок і кінець одного радка, вони позначали кінець і початок рядка де завгодно посеред ланцюжка.

s : Розглянути ланцюжок ніби він складається з одного рядка. Тобто, змінити "." таким чином, щоб вона збігалася із взагалі будь-яким знаком, навіть нового рядка "\n".

Модифікатори "/s" і "/m", обидва, переважать параметри $. Тобто, незалежно від того, що містить $, "/s" без "/m" спричинить збіг "^" із початком ланцюжка і "$" - з кінцем (або з положенням одразу попереду останнього "\n") ланцюжка. Разом як "/ms", вони дозволяють збіг "." з довільним знаком (нового рядка включно) і "^" з "$" співпадати з, відповідно, положенням одразу після і одразу попереду нових рядків де завгодно в ланцюжкові.

x : Покращити зрозумілість ваших регулярних виразів шляхом дозволу пробілів і коментарів.

Це, зазвичай, вказується в текстах як "модифікатор '/x'", хоча розділювач не обов'язково складається з похилої риски. Будь-який з цих модифікаторів можна включити в самий регулярний вираз, використовуючи конструкцію "?(...)'. Дивіться нижче.

Самий модифікатор "/x" вимагає додаткових пояснень. Він вказує оброблювчу регулярних виразів ігнорувати пробіли, не екрановані зворотньою похилою або такі, що не являються частиною класу знаків. Ви можете скористатися цим, щоб розбити ваші регулярні вирази в (трохи) розбірливіші частини. Знак "#" розглядатиметься як метасимвол у цьому випадку, розпочинаючи коментар, схоже до звичайного коду Perl. Це одночасно означає, що якщо вам потрібен справжній знак пробілу або "#" посеред зразка (поза класом знаків, де "/x" на них не впливає), тоді вам треба або екранувати їх зворотньою похилою, або закодувати іх, використовуючи вісімкову, або шістнадцяткову керівні послідовності. Візьміть на замітку, не включити випадково розділювач регулярного виразу у коментар - Perl не в змозі з'ясувати, чи ви не намірівалися закрити регулярний вираз раніше. Дивіться код видалення C-коме нтарів сторінки ?perlop(1).

Регулярні вирази

Вирази, використовувані в зіставлянні зі зразками Perl походять з функцій регулярних виразів Версії 8. (Самі функції мають (віддалене) відношення до заново втіленних Генрі Спенсером вільно розповсюджуваних функцій V8.) Дивіться "Регулярні вирази Верс ії 8" щодо подробиць.

Зокрема, наступні метасимволи зберегли свій стандартний egrep-подібний зміст:

\ : Екранує наступний метасимвол.

^ : Збігається з початком рядка.

&. : Збігається з будь-яким знаком (за винятком нового рядка).

$ : Збігається з кінцем рядка (або положенням одразу перед новим рядком в кінці).

| : Знак альтернативого вибору.

() : Групування.

[] : Клас знаків.

Стандартно, знак "^" гарантовано збігатиметься тільки з початком ланцюжка, тоді як "$" - із кінцем (перед знаком нового рядка вкінці), і Perl здійснює певну оптимізацію, припускаючи, що ланцюжок містить тільки один рядок. Тож "^" або "$" не збігатимуться з ланцюжком із включеними всередину знаками нового рядка. Ви можете, однак, розглянути ланцюжок як багаторядковий буфер, тож "^" збігатиметься з положенням після нового рядка в ланцюжкові і "$" - з положенням до. Ціною незначної втрати швидкості, цього можна добитися за використання модифікатору "/m". (Старші програми втілювали цей ефект через встановлення змінної $*, але така практика застаріла.)

Для спрощення багаторядкових замін, знак "." ніколи не збігається з символом нового рядка, за винятком коли ви використаєте модифікатор "/s", який фактично вказує Perl розглянути ланцюжок як такий, що складається з одного рядка, навіть якщо це не так. Модифікатор "/s" так само пересилить параметри $*, у випадку, коли ви маєте якийсь старший код (який погано поводиться), що встановлює цю змінну в якомусь іншому модулі.

Perl розпізнає наступні квантори (кількісні модифікатори):

* : Збіг 0 або більше раз.

+ : Збіг 1 або більше раз

? : Збіг 1 або 0 раз.

{n} : Збіг точно n разів.

{n,} : Збіг щонайменше n разів.

{n,m} : Збіг щонайменше n разів, але не більше за m раз.

(Якщо фігурні дужки зустрінуто в якомусь іншому контексті, вони вважатимуться звичайним знаком. Зокрема, нижнє обмеження збігів "n" є обов'язковим для квантору.) Модифікатор "*" рівнозначний "{0,}", модифікатор "+" - "{1,}", тоді як "?" - "{0,1}". Числа "n" і "m" обмежуються цілими значеннями, меншими за верхню межу, встановлену під час компіляції perl. Це, зазвичай, дорівнює 32766 на найпоширеніших платформах. Дійсну границю можна побачити завдяки повідомленню про помилку, генеровану кодом на зразок наступного:

    $_ **= $_ , / {$_} / for 2 .. 42;

Типово, частина шаблона квантору є "жадібною", тобто вона збіжиться стільки раз, скільки це можливо (починаючи з певного початкового положення), одночасно дозволяючи збіг решти шаблона. Якщо би ви хотіли найменшу кількість збігів, то краще додати "?" одразу за квантором. Зауважте, що зміст не міняється, тільки "жадібність":

*? : Збіг 0 або більше разів

+? : Збіг 1 або більше разів

?? : Збіг 0 або 1 раз

{n}? : Збіг точно n разів

{n,}? : Збіг щонайменше n разів

{n,m}? : Збіг щонайменше n, але не більше за m разів

Через те, що зразки обробляються як ланцюжки, включені в подвійні дужки, наступні знаки також працюватимуть:

\t : табуляція (HT, TAB)

\n : знак нового рядка (LF, NL)

\r : повернення каретки (CR)

\f : зміна сторінки (FF)

\a : двінок (BEL)

\e : перемикання коду (ESC)

\033 : вісімковий знак (як в PDP-11)

\x1B : шістнядцятковий знак

\x{263a} : широкий шістнадцятковий знак (Юнікод SMILEY)

\c[ : керівний символ

\N{назва} : символ з навою

\l : наступний знак нижнього регістру (як у vi)

\u : наступний знак верхнього регістру (як у vi)

\L : нижнього регістру до \E (як у vi)

\U : верхнього регістру до \E (як у vi)

\E : завершення зміни регістру (як у vi)

\Q : екранування (блокування) метазанаків до \E

Коли діє прагма "use locale", мапа регістрів, використовувана "\l", "\L", "\u" і "\U", відпвідає поточній локалі. Дивіться ?perllocale(1). Для документації щодо "\N{name}" загляніть до ?charnames(3).

Ви не можете включити буквальні "$" або "@" до послідовності "\Q". Неекрановані "$" або "@" розкривають відповідні змінні, тоді як їхнє екранування призведе до збігу з буквальним ланцюжком "\$". Вам доведеться писати щось на зразок "m/\Quser\E\@\Qhost/".

На додаток, Perl визначає ще наступні скорочення:

\w : Збігається зі знаком, що може бути частиною слова (буквенно-числові символи та "_").

\W : Збігається зі знаком, що не може бути частиною слова.

\s : Збігається з пробілом.

\S : Збігається з не-пробілом.

\d : Збігається з цифрою.

\D : Збігається з не-цифрою.

\pP : Збігається з P, відповідно названим. Скористайтеся з \p{назва} для довших імен символів.

\PP : Збігається з не-P.

\X : Збігається з розширеним Юнікодом, еквівалентне (?:\PM\pM*).

\C : Збігається зі знаком, що відповідає вісімковому C, навіть при Юнікоді.

Послідовність "\w" збігається з одним буквенно-цифровим символом або "_", а не цілим словом. Користуйтеся "\w+" для збігу з ланцюжком з символів, які Perl вважає, що складають слово (що не завжди відповідає поняттю англійського слова). Якщо діє "use locale", список алфавітних символів, генерованих "\w", буде взято з поточної локалі. Дивіться ?perllocale(1).