- Рекурсивные шаблоны
Добавлена конструкция
(?PARNO)
для составления рекурсивных структур регексов.Каждый захват скобок может теперь рассматриваться как независимый шаблон, который может быть введен с использованием синтаксиса
(?PARNO)
(гдеPARNO
- номер захватывающего буфера). Например, следующий шаблон будет сопоставлен вложенным сбалансированным угловым скобкам."text.. <a <b> > .. text.. " =~ /( <(?: (?>[^<>]+) | (?1) # возврат к началу первой # захватывающей скобке )*> )/x and print $1; # выводит <a <b> >;
Я пока данную возможность на практике не использовал, если у вас имеются более показательные примеры реализации рекурсивных структур с использованием
(?PARNO)
поделитесь с народом в комментарии к этому посту, если не жалко. - Именованные захватывающие скобки
Теперь в шаблоне можно именовать захватывающие скобки и обращаться к их содержимому по имени. Синтаксис именования
(?<NAME>....)
. Это позволяет ссылаться к именованным буферам используя синтаксис\k<NAME>
. В шаблоне, новые магические хэши%+
и%-
могут быть использованы для доступа к содержимому буферу захвата.Простой пример удаления дублирующих симвовов с использованием именованных захватывающих скобок:
my $word = "aab"; # удалить дублирующие символы $word =~ s/(?<letter>.)\k<letter>/$+{letter}/g; print $word; # выводит "ab"
В
%+
и%-
сохраняются именованные буферы захвата:'foo' =~ /(?<named_buffer>foo)/; # теперь в %+ и %- содержится следующее %- =( 'named_buffer' => 'foo'); %- =( 'named_buffer' => [ 'foo' ] );
%+
и%-
реализуются как связанные хэши с помощью стандартного модуля Tie::Hash::NamedCapture.--- неясности с переводом --- здесь содержится то, что я не смог перевести, надеюсь на отзывчивость perlhack`еров ----------------------------- --- EN --- Users exposed to the .NET regex engine will find that the perl implementation differs in that the numerical ordering of the buffers is sequential, and not "unnamed first, then named". Thus in the pattern --- RU --- Пользователи, использующие регулярную машину .NET найдут, что perl реализация буферов в что числовое упорядочивание буферов является последовательным, и не "названный первым, который тогда назван". Таким образом шаблон /(A)(?<B>B)(C)(?<D>D)/ --- EN --- $1 will be 'A', $2 will be 'B', $3 will be 'C' and $4 will be 'D' and not $1 is 'A', $2 is 'C' and $3 is 'B' and $4 is 'D' that a .NET programmer would expect. This is considered a feature. :-) (Yves Orton) --- RU --- $1 будет содержать 'A', $2 будет содержать 'B', $3 будет содержать 'C' и $4 будет 'D', что .NET программист будет ожидать. Это продуманная функция :) (Yves Orton) ---/ неясности с переводом ---
- Сверхжадные квантификаторы
Perl теперь поддерживает "сверхжадные квантификаторы"(possessive quantifier) которые захватывают максимальное соответствие и никогда не возвращаются назад. Таким образом они могут быть использованы для контроля отката назад(control backtraking). Сверхжадный квантификатор синтаксически может использоваться там же где и нежадный модификатор(non-greedy)
?
, только вместо него ставится модификатор+
. В результате получаются примерно такие конструкции?+
,*+
,++
,{min,max}+
.P.S:
По сверхдажным квантификаторам есть хорошая статья на хабре - Глаголы Backtracking контроля
Машина регулярных выражений поддерживает ряд глаголов специального назначения для контроля отката назад(backtrack control): (*THEN), (*PRUNE), (*MARK), (*SKIP), (*COMMIT), (*FAIL) и (*ACCEPT). За подробностями обращайтесь к странице perlre. (Yves Orton)
- Относительные обратные ссылки (Relative backreferences)
Новые синтаксические конструкции
\g{N}
или\gN
где "N" десятичное число позволяет безопасную форму обозначений ссылок на найденный текст а также позволяет относительные ссылки на найденный текст. Это должно сделать легче генерацию и вставку шаблонов, которые содержат ссылки на найденный текст. Смотрите Буферы захвата . (Yves Orton) - Метазнак
\K
Функциональность модуля Regexp::Keep Джеффа Пинуана(Jeff Pinyan) была встроена в ядро. В регулярных выражениях вы можете теперь использовать специальный метасимвол
\K
как способ исользовать что-нибудь наподобие конструкции плавающего позитивного заглядывания назадs/(foo)bar/$1/g
что может быть преобразовано в
s/foo\Kbar//g
который является гораздо более эффективным. (Yves Orton)
- Вертикальный, горизонтальный пробел и разрыв строки
Регулярные выражения теперь распознают escape последовательности
\v
и\h
которые соответствуют символам вертикального и горизонтального пробела.\V
и\H
логично противоположны первым двум метасимволам.\R
соответствует общему символу разрыва строки, то есть символу вертикального пробела плюс последовательность символов"\x0D\x0A"
.