Perl - регулярные выражения с примерами

Поговорим об особенностях и синтаксисе регулярных выражений Perl 6.
2 минуты8591

На фото изобретатель 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-специалист.

программированиеdata-scienceразработкановости it
Нашли ошибку в тексте? Напишите нам.
Спасибо,
что читаете наш блог!