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 можно добавить целочисленный аргумент, чтобы сместить начало матча в нужную позицию.