Прежде чем я отвечу, я хотел бы отметить, что использование встроенной формы кода Perl (??...)
может быть чревато ошибками, если вы не до конца понимаете, что это значит. Я написал регулярное выражение для Perl более двадцати лет, и моя естественная тенденция - всегда кодировать «вариант использования», подобный этому, в качестве фильтра к результату регулярного выражения, а не вставлять код Perl непосредственно в регулярное выражение. Вы были предупреждены.
Хорошо, давайте выберем это регулярное выражение:
^ # start of text
( # begin capture group
\d+ # one or more digits 0-9
) # end of capture group
% # literal percent sign character
$ # end of text
(??{ # start embedded perl code
$^N >= 80 # if last closed match group($^N) is greater than or equal to 80
? '' # then return empty pattern ('')
: '^' # else return start of text (^) pattern
}) # end embedded perl code
, где $^N
ссылается на значение самой последней пары закрытых совпадений, а предложение (??{ ... })
с нулевой шириной выполнит переносимый им код perl, преобразовав возвращаемое значение в новое регулярное выражение, которое будет добавлено к исходному. шаблон.
Итак, в этом примере мы сопоставляем одну или несколько цифр, за которыми сразу следует знак процента. Затем, если захваченное значение больше или равно 80, оценивают пустой текст по тексту (эффективно позволяя совпадать с общим шаблоном, возвращая захваченное значение), или, если нет, оценивают ^
(начало текста) шаблон, который не может соответствовать в конце строки, фактически ничего не возвращая.
( Обратите внимание , что, добавив модификатор / x к вашему регулярному выражению Perl, вы можете вставлять комментарии непосредственно в шаблон, который также будет игнорировать встроенные пробелы. Я считаю, что это отличный способ документирования сложных регулярных выражений.)