* квантификатор в Perl 6 - PullRequest
       76

* квантификатор в Perl 6

0 голосов
/ 08 декабря 2018

Кажется, это что-то очень простое, чего я здесь не понимаю.

Почему "babc" не соответствует / a * /?

> "abc" ~~ / a /
「a」
> "abc" ~~ / a * /
「a」
> "babc" ~~ / a * /
「」                    # WHY?
> "babc" ~~ / a + /
「a」

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Ответы здесь верны, я просто попытаюсь представить их в более последовательной форме:

Совпадение всегда начинается слева

Движок регулярных выражений всегда запускается слева отстроки и предпочитает крайнее левое совпадение по сравнению с более длинными совпадениями

* совпадения с пустыми строками

совпадения регулярного выражения a* могут совпадать со строками '', 'a', 'aa' и т. д. Он всегда предпочитает самое длинное совпадение, которое находит, но не может найти совпадение длиннее пустой строки, он просто сопоставляет пустую строку.

Соединение вместе

В 'abc' ~~ /a*/ двигатель регулярного выражения запускается в позиции 0, a* соответствует как можно большему количеству а и, таким образом, соответствует первому символу.

В 'babc' ~~ /a*/ двигатель регулярного выражения запускается в позиции0, а a* может соответствовать только нулевым символам.Это делает это успешно.Так как общий матч проходит успешно, нет причин пытаться снова в позиции 1.

0 голосов
/ 08 декабря 2018

Поскольку квантификатор * устанавливает соответствие предыдущего атома ноль или более раз.

「」 - первое совпадение / a * / в любой строке.Например:

say "xabc" ~~ / a * . /; # OUTPUT: 「x」

это то же самое:

say "xabc" ~~ / (a+)? . /;

Если вы установите шаблон более точно, вы получите другой результат:

say "xabc" ~~ / x a * /; # OUTPUT: 「xa」
say "xabc" ~~ / a * b /; # OUTPUT: 「ab」
...