Сопоставление с образцом lua: захват с разделителями

Я пытаюсь разобрать строку, такую ​​как: &1 first &2 second &4 fourth \\и из него построить стол

t = {1=first, 2=second, 4=fourth}

Я не очень разбираюсь в регулярных выражениях в целом, поэтому моя наивная попытка (без учета \\ и части стола на данный момент)

local s = [[&1 first &2 second &4 fourth \\]]

for k,v in string.gmatch(s, "&(%d+)(.-)&") do
    print("k = "..k..", v = "..v)
end

который дает только первую захваченную пару, когда я ожидал увидеть две захваченные пары. Я прочитал немного и нашел lpeg библиотека, но она мне совершенно незнакома. Является lpeg нужен здесь? Кто-нибудь может объяснить мою ошибку?

2 ответа

Решение
  1. &(%d+)(.-)& Матчи &1 first &
  2. уход 2 second &4 fourth \\ быть подобранным по
  3. Ваш шаблон не соответствует ни одному другому элементу

Если вы знаете, что значения являются одним словом, это должно работать:

string.gmatch(s, "&(%d+)%s+([^%s&]+)")

Возьмите "&", затем 1 или несколько цифр (захвачено), затем один или несколько пробелов и затем один или несколько не пробелов, не & символы (захвачено).

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