Влияет ли храповик на структуры гнездования и «экономные кватификаторы»? - PullRequest
9 голосов
/ 08 апреля 2019

В Perl 6 можно использовать оператор тильды для вложенных структур. Видимо, трещотка влияет на работу структуры вложенности.

В этом случае не используется храповик:

$ perl6 -e "say '{hello} aaa }' ~~ / '{' ~ '}' ( .+? ) /"
「{hello}」
 0 => 「hello」

в то время как это делает:

$ perl6 -e"say '{hello} aaa }' ~~ / :r '{' ~ '}' ( .+? ) /"
Nil

Я могу получить ожидаемый результат, изменив шаблон .+? на более конкретный <-[}]> +:

$ perl6 -e"say '{hello} aaa }' ~~ / :r '{' ~ '}' ( <-[}]> + ) /"
「{hello}」
 0 => 「hello」

но я не знаю, почему «экономный квантификатор» не работает с помощью храповика. Есть идеи?

(с использованием rakudo 2019.03.1)

1 Ответ

9 голосов
/ 08 апреля 2019

Наречие :ratchet regex запрещает двигателю возвращаться в количественный подшаблон.

Первый шаблон / :r '{' ~ '}' ( .+? ) / означает, что шаблон .+? после того, как он соответствует любому 1 илибольше символов, как можно меньше, не будут повторно проверены, и будут повторно введены при последующем сбое шаблона.

Здесь, в вашем примере {hello} aaa }, после тестирования {, .+?соответствует h, а затем } не соответствует e.Поскольку обратное отслеживание не разрешено, сопоставление не удается, и начинается следующая итерация: h проверяется на {, не выполняется и т. Д.

Второе регулярное выражение с <-[}]> + работает, поскольку оно соответствует любому 1+символы , отличные от }, и это принципиальное отличие от .+?, которое может соответствовать } и обязательно потреблять не менее 1 символа (из-за +).Таким образом, он не может потреблять } и находит совпадение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...