Как точно сопоставить n повторений шаблона в Lua?

Я пишу грамматику, которая включает в себя ровно три буквенных символа. Вот мой код:

local l = require "lpeg"

l.locale(l)

local date = l.digit^1 * l.P'/' * l.digit^1 * l.P'/' * l.digit^1
local time = l.digit^1 * l.P':' * l.digit^1 * l.P':' * l.digit^1 * l.P':' * l.digit^1  
local timezone = l.alpha^3
local stamp = l.P'[' * date * l.P' ' * time * l.P' ' * timezone * l.P']'

grammar = l.C(stamp)

Вход, с которым я сопоставляю это:

[23.04.15 4:49:49:371 CDT]

Как получить выражение, совпадающее только с тремя буквенными символами в часовом поясе? Теперь этот код работает так, что он будет соответствовать трем или более буквенным символам.


Weird! Это работает?

local timezone = l.alpha*2

Кажется, но я не могу найти тот синтаксис, на который ссылаются здесь:

http://www.inf.puc-rio.br/~roberto/lpeg/lpeg.html

1 ответ

Решение

l.alpha*2 является l.alpha*l.P(2),

Так что нет, это соответствует [a-z]..,

Смотрите вывод из lpeg.print(timezone) чтобы подтвердить это. (Обратите внимание на мое использование ll для данных локали. Положив его в ту же таблицу, теряет оригинал print функция отладки.)

> l=require"lpeg"
> ll=lpeg.locale()
> p=ll.alpha*2
> l.print(p)
[]
00: set [(41-5a)(61-7a)]-> FAIL
05: any * 2-> FAIL
06: end
> =p.match("099")
nil
> =p.match("EST")
4
> =p.match("E99")
4

Шаблон, который вы хотите:

> function patcount(pat, min, max)
>>  return -pat^(max + 1) * pat^min
>> end
> p=patcount(ll.alpha, 3, 3)
> lpeg.print(p)
[]
00: set [(41-5a)(61-7a)]-> 27
05: choice -> 27 (1)
06: set [(41-5a)(61-7a)]-> FAIL
11: set [(41-5a)(61-7a)]-> FAIL
16: set [(41-5a)(61-7a)]-> FAIL
21: span [(41-5a)(61-7a)]
26: failtwice
27: set [(41-5a)(61-7a)]-> FAIL
32: set [(41-5a)(61-7a)]-> FAIL
37: set [(41-5a)(61-7a)]-> FAIL
42: span [(41-5a)(61-7a)]
47: end
> =p:match("EST")
4
> return p:match("ES")
nil
> return p:match("ESTT")
nil
> return p:match("099")
nil
> return p:match("E99")
nil

Бит соответствующей документации -patt,

Что касается l.alpha*2 синтаксис, который объясняется этой цитатой из руководства.

Все операции, которые ожидают шаблон в качестве аргумента, могут также получать строки, таблицы, числа, логические значения или функции, которые переводятся в шаблоны в соответствии с правилами функции lpeg.P.

То есть операторы преобразуют не-шаблоны в шаблоны, когда один из операндов уже является шаблоном.

На вики-странице LpegRecipes lua-users.org также есть раздел "Совпадение с фиксированным числом повторений шаблона" (и ссылка). (Но я не рассматривал эту реализацию вообще, и она выглядит более сложной, чем моя выше.)

Другие вопросы по тегам