Lua模式: %b{}? 可选平衡花括号

3

我希望可选的平衡括号可以成为我的匹配部分。是否只使用普通模式就可以实现呢? 我的测试代码如下:

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

你的字符串中可以有 str5{a{},b{}} 吗? - undefined
是的,我可以。我应该把那个放进去... - undefined
2个回答

3

%b{}? 可能有可选的平衡花括号

不行。您需要按逗号拆分,并处理您完成此操作的方式。

简化的一种方法可能是首先用([^}]),替换为\1{},然后应用您的处理而不需要任何特殊情况。


我其实也想到过这一点,但我不知道替换函数可以接受模式。谢谢你的帮助。但在接受你的答案之前,我会再等一天或两天看看是否还有其他答案。 - undefined
如果您不想处理模式替换,前沿模式也可能适用:gsub("%f[},],","{},") - undefined

1
一个可能的解决方法是将大括号内的逗号替换为零(在逗号分割后恢复它们)。
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{}}

非常优雅的解决方案,使用了该函数参数。为了更好的可读性,我将这行代码分开了,但这个解决方案绝对棒极了。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接