Чтобы сопоставить строку, начинающуюся с dog
, за которой следует cat
(но не потребляя cat
), это работает:
local lpeg = require 'lpeg'
local str1 = 'dogcat'
local patt1 = lpeg.C(lpeg.P('dog')) * #lpeg.P('cat')
print(lpeg.match(patt1, str1))
Выход: dog
Чтобы сопоставить строку, начинающуюся с dog
, за которой следует любая последовательность символов, а затем следует cat
(но не потребляя ее), как регулярное выражение с опережением (dog.+?)(?=cat)
, я попробовал это:
local str2 = 'dog and cat'
local patt2 = lpeg.C(lpeg.P("dog") * lpeg.P(1) ^ 1) * #lpeg.P("cat")
print(lpeg.match(patt2, str2))
Мой ожидаемый результат — dog and
, но он возвращает nil
.
Если я отбрасываю упреждающую часть (т. е. использую шаблон lpeg.C(lpeg.P("dog") * lpeg.P(1) ^ 1)
), он может успешно сопоставить всю строку. Это означает, что часть * lpeg.P(1) ^ 1
правильно соответствует любой последовательности символов, не так ли?
Как это исправить?