Perl - регулярные выражения с примерами
На фото изобретатель Perl Ларри Уолл
В конце 90-х перл был одним из наиболее развитых интерпретируемых языков в области обработки текстов. Его регулярные выражения позволяли компактно задавать сложные правила анализа и преобразования текстов. Со временем они были портированы на наиболее популярные языки программирования, внедрены в различные текстовые процессоры и поисковые системы. Однако существенным фактором, ограничивавшим их широкое применение, была «непрозрачность» их синтаксиса.
В Perl 6 переработан синтаксис регулярных выражений (в документации regex).
Появилась возможность использовать именованные регулярные выражения (named regex) - примеры:
my token sign { <[+-]> }
my token decimal { \d+ }
my token mantissa { [||<decimal>?'.'<decimal> ||<decimal>?'.'<decimal>] }
my token exponent { 'e' <sign>? <decimal> }
my regex float {
$<sign>=(<sign>?)
<mantissa>
<exponent>?
}if "3.14e+1" ~~ / <float> / {
given $<float> {
say .<sign>~.<mantissa>~(.<exponent>.defined??.<exponent>!!"");}
}
Группировка, комбинирование именованных регулярных выражений в Perl 6, задание альтернативных вариантов (метасимвол «||») делают код регулярных выражений более «прозрачным», упрощая его модификацию относительно аналогичного кода в предыдущих версиях Perl:
/([+-]?)((([0-9]*)\.([0-9]*))|(()\.([0-9]+)))([Ee][+-]?[0-9]+)?/
Имена регулярных выражений «переходят» полученным в результате обработки подстрокам. При этом можно задавать имена подстрок непосредственно в регулярном выражении Perl. Это позволяет обращаться к полученным результатам по именам, что делает более «прозрачной» обработку полученных строк.
Приведенное в примере ключевое слово «token» аналогично применению в Perl «regex» с модификатором «:r» или «:ratchet» (трещотка, не позволяющая откатываться назад), указывает на последовательную обработку литерал до заполнения. То есть без модификатора:
say so 'ab' ~~ / \w+ . /;
Возвращаемое значение true, так как литерала «w+» захватывает значение a, «.» – b.
При указании «:r», литерала \w+ захватит «ab» и для заполнения «.» ничего не остается.
Соответственно, выражение:
say so 'ab' ~~ / :r \w+ . /;
возвращает значение false.
Модификатор «:sigspace» или «:s» позволяет воспринимать последовательности разделителей: таких как, например, пробел (U+0020), неразрывный пробел (U+00A0), табуляция (U+0009), типографский квадрат (U+2001), как один разделитель.
say so "I used Photoshop®" ~~ m:i/ photo shop /; # True
say so "I used a photo shop" ~~ m:i:s/ photo shop /; # True
say so "I used a photo shop" ~~ m:i:s/ photo shop /; # True
say so "I used Photoshop®" ~~ m:i:s/ photo shop /; # False
Совместное применение модификаторов «:s» и «:ratchet» задается ключевым словом «rule»:
my rule {a b}
Добавлен модификатор «:overlap» (сокращенно «:ov» ) позволяющие получать пересекающиеся подстроки:
given 'abracadabra' {
for m:overlap/ a .* a / -> $match {
say ' ' x $match.from, ~$match;
}}
Результат:
produces
abracadabra
acadabra
adabra
abra
Модификатор :exhaustive, сокращенно «:ex», позволяющий получить полную выборку соответствующих выражению подстрок, допускающих пересечение результатов и использование различных сочетаний:
given 'abracadabra' {
for m:exhaustive/ a .* a / -> $match {
say ' ' x $match.from, ~$match;
}
}
Результат:
abracadabra
abracada
abraca
abra
acadabra
acada
aca
adabra
ada
abra
В Perl 6 сохранена возможность использовать регулярные выражения Perl 5 - для этого служит модификатор «:perl5» (короткая версия «:P5»):
Perl 5: $str =~ m/^\d{2,5}\s/i
Perl 6: $str ~~ m:P5:i/^\d{2,5}\s/
При этом важно учитывать, что подстроки в Perl 6 нумеруются с $0, а не с $1.
Новый синтаксис регулярных выражений Perl 6 позволяет создавать более «прозрачные» коды для обработки текстов, при этом сохраняется возможность использования «компактных» версий. Это делает синтаксис Perl более дружелюбным и, несомненно, упростит работу с текстом для широкого круга разработчиков.
При подготовке статьи использовались материалы http://perl6.org/.
P.S. Несмотря на то, что релиз Perl 6 еще не вышел, релизы интерпритатора "Rakudo" выходят достаточно регулярно и доступны в репозитариях (apt-get install rakudo). Скачать можно по ссылке.
А пока отписывайтесь в комментариях, интересна ли вам эта тема, - и мы продолжим копать вглубь!
P.P.S. Тем, кто хочет стать программистом, рекомендуем профессию «Веб-разработчик».
Освоить востребованную профессию в Data Science можно всего за полтора года на курсах GeekBrains. После учёбы вы сможете работать по специальностям Data Scientist, Data Analyst, Machine Learning, Engineer Computer Vision-специалист или NLP-специалист.