Шаблон Lua:% b {}?возможны дополнительные сбалансированные брекеты - PullRequest
0 голосов
/ 14 мая 2018

Я хочу иметь дополнительные сбалансированные скобки, чтобы быть частью моего матча.Это возможно только с нормальными образцами?Мой тестовый код выглядит следующим образом:

for m in string.match('str{},str2{str3{}},str4,str5{a{}b{}}', '[^,]-%b{}') do
  print(v)
end

вывод:

str{}
str2{str3{}}
str5{a{}b{}}

недостающая часть str4

Я думал, что шаблон [^,]-%b{}? будетсделать это, но% bxy и?оба элемента шаблона, поэтому, конечно, он не работает, но есть ли способ сделать это в любом случае?

Мой обходной путь на данный момент:

local stored
for e in string.gmatch(str, '[^,]+') do
  if stored then
    e = stored .. ',' .. e
  end
  if string.match(e, '^[^{}]+$') or string.match(e, '^[^{}]*%b{}[^{}]*$') then
    print(e)
    stored = nil
  else
    stored = e
  end
end

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Возможный обходной путь - заменить запятые внутри фигурных скобок нулями (и восстановить их после разделения запятых).

local str = 'str{},str2{str3{}},str4,str5{a{},b{}}'
for m in str:gsub('%b{}', function(b) return b:gsub(',', '\0') end):gmatch'[^,]+' do
   m = m:gsub('%z', ',')
   print(m)
end

Вывод:

str{}
str2{str3{}}
str4
str5{a{},b{}}
0 голосов
/ 15 мая 2018

% б {}? возможны дополнительные сбалансированные брекеты

Нет. Вам нужно разделить запятую и обработать так, как вы это сделали.

Один из способов упрощения может состоять в том, чтобы сначала заменить ([^}]), на \1{},, а затем применить обработку без особых случаев.

...