Месяц: Март 2018
Вешалки
Пешеходный переход в Швейцарии
Текстовый курсор
Знак
Дерево на фоне неба
Amsterdam, Netherlands
Zandvoort, Netherlands
67. Модификаторы (adverbs) в регексах Perl 6, часть 3
Осталось рассмотреть три модификатора: :r, :ov и :ex.
:r или :ratchet
Запрет на бектрекинг. Сравните две попытки:
> 123 ~~ / \d+ 3/
「123」
> 123 ~~ m:r/ \d+ 3/
False
Несмотря на то, что сам по себе регекс подходит к числу 123, во втором случае класс \d+ захватил все цифры и отказывается уступать. Более реалистичный случай использования :r вы можете встретить в конструкциях с альтернативами |.
:ov или :overlap
Разрешает поиск с пересечениями. Если в одной позиции начинается более чем одна подходящая последовательность, то выбирается самая длинная. Например, найти все строки, начинающиеся с 1 и заканчивающиеся 2:
> 12345678913234 ~~ m:ov/ 1 .* 2 / (「123456789132」 「132」) > 12345678913234 ~~ m:ov/ 1 .*? 2 / (「12」 「132」)
:ex или :exhaustive
Работает как :ov, но снимает ограничения на поиск самых длинных последовательностей. То есть этот модификатор найдет все:
> 12345678913234 ~~ m:ex/ 1 .* 2 / (「123456789132」 「12」 「132」) > 12345678913234 ~~ m:ex/ 1 .*? 2 / (「12」 「123456789132」 「132」)
66. Модификаторы (adverbs) в регексах Perl 6, часть 2
Сегодня — продолжение обзора модификаторов регексов в Perl 6.
:p(N) или :pos(N)
Начать поиск с указанной позиции. Важно обратить внимание на то, что при использовании этого адверба (как их называть по-русски? наречия вроде не оч в тему, а название модификаторы было в Perl 5) регекс привязывается к этой позиции и не может пропустить другие символы перед тем, как совпасть.
> 'hello world' ~~ /l./ 「ll」 > 'hello world' ~~ m:p(0)/l./ False > 'hello world' ~~ m:p(1)/l./ False > 'hello world' ~~ m:p(2)/l./ 「ll」
Попробуем найти третье вхождение буквы l:
> 'hello world' ~~ m:p(8)/l./ False > 'hello world' ~~ m:p(9)/l./ 「ld」
:c или :continue
Продолжить с места предыдущего совпадения. Рассмотрим на примере с той же строкой:
> 'hello world' ~~ /l./
「ll」
> 'hello world' ~~ /l./
「ll」
> 'hello world' ~~ m:c/l./
「ld」
Аналогично :p, к :c можно добавить целочисленный аргумент, чтобы сместить начало матча в нужную позицию.