N-значный Pattern Matching в Lua - PullRequest
       34

N-значный Pattern Matching в Lua

3 голосов
/ 17 октября 2010

Я новичок в Lua.

Скажите, у меня есть строка "1234567890".

Я хочу перебрать все возможные трехзначные числа. (т.е. 123,234,345,456....)

for m in string.gmatch("1234567890","%d%d%d") do
      print (m)
end

Но это дает мне вывод 123,456,789.

Какой шаблон мне следует использовать?

И, во-вторых, связанный вопрос, как мне указать 3-digit номер? "%3d" не похоже на работу. "%d%d%d" единственный путь?

Примечание: Это не помечено Regular expression, поскольку у Lua нет RegExp. (хотя бы изначально)

Заранее спасибо:)

Обновление: Как отмечает Янтарь, в Lua "перекрывающихся" матчей нет. И что касается второго запроса, я застрял, используя string.rep("%d",n), так как Lua не поддерживает фиксированное количество повторов.

Ответы [ 2 ]

4 голосов
/ 18 октября 2010

Вы правы, что ядро ​​Lua не содержит полных регулярных выражений. Шаблоны, понятные модулю string, более просты, но достаточны для многих случаев. К сожалению, совпадение n-значных чисел не является одним из них.

Тем не менее, вы можете вручную выполнить итерацию по длине строки и попытаться найти совпадение в каждой позиции, поскольку функция string.match принимает начальный индекс. Например:

s = "1234567890"
for i=1,#s do
    m = s:match("%d%d%d", i)
    if m then print(m) end
end

Это дает следующий вывод:

C:>Lua
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> s = "1234567890"
> for i=1,#s do
>>     m = s:match("%d%d%d", i)
>>     if m then print(m) end
>> end
123
234
345
456
567
678
789
890
>
4 голосов
/ 17 октября 2010

gmatch никогда не возвращает перекрывающихся совпадений (а gsub никогда не заменяет перекрывающихся совпадений, fwiw).

Лучше всего было бы, вероятно, перебирать все возможные подстроки длины 3, проверьте каждую, чтобы увидеть,они соответствуют шаблону для трехзначного числа и, если это так, воздействуют на них.

(И да, %d%d%d - единственный способ написать его. Поддержка сокращенных шаблонов Lua не имеет фиксированнойСинтаксис числа повторений.

...