好吧,在普通的 Lua 中,你可以做这样的事情,同时考虑嵌套括号:
function bm(s)
local res ={}
if not s:match('%[') then
return s
end
for k in s:gmatch('%b[]') do
res[#res+1] = bm(k:sub(2,-2))
end
return res
end
当然,您可以很容易地将其概括为大括号、圆括号等(请记住模式中 [] 的必要转义,但 %b 模式后面除外)。
如果您不限于普通 Lua,则可以使用 LPeg 以获得更大的灵活性
如果您不是在寻找括号的内容,而是在寻找位置,那么递归方法更难实现,因为您应该跟踪自己的位置。更简单的是遍历字符串并在进行时匹配它们:
function bm(s,i)
local res={}
res.par=res -- Root
local lev = 0
for loc=1,#s do
if s:sub(loc,loc) == '[' then
lev = lev+1
local t={par=res,start=loc,lev=lev} -- keep track of the parent
res[#res+1] = t -- Add to the parent
res = t -- make this the current working table
print('[',lev,loc)
elseif s:sub(loc,loc) == ']' then
lev = lev-1
if lev<0 then error('too many ]') end -- more closing than opening.
print(']',lev,loc)
res.stop=loc -- save bracket closing position
res = res.par -- revert to the parent.
end
end
return res
end
现在您已经有了所有匹配的括号,您可以遍历表格,提取所有位置。