模式不匹配 *(%(*.%))

Pattern not matching *(%(*.%))

我正在尝试从 reference manual.

中了解模式(在 string.gmatch 等中实现)如何在 Lua 5.3 中发挥作用

(感谢@greatwolf 使用 * 纠正我对模式项的解释。)

我想要做的是匹配 '(%(.*%))*'(由 括起来的子字符串;例如, '(grouped (etc))'), 所以它记录

(grouped (etc))
(etc)

grouped (etc)
etc

但它什么也没做 (online compiler)。

local test = '(grouped (etc))'

for sub in test:gmatch '(%(.*%))*' do
    print(sub)
end

我不认为你可以用 gmatch 做到这一点,但使用 %b()while 循环可能会起作用:

local pos, _, sub = 0
while true do
  pos, _, sub  = ('(grouped (etc))'):find('(%b())', pos+1)
  if not sub then break end
  print(sub)
end

这会为我打印出您的预期结果。

local test = '(grouped (etc))'

print( test:match '.+%((.-)%)' )

这里:

。 +%( 捕获最大字符数,直到它 %( 即直到包含它的最后一个括号,其中 %( 只是转义括号。

(.-)%) 将 return 你的子字符串到第一个转义括号 %

另一种可能性——使用递归:

function show(s)
  for s in s:gmatch '%b()' do
    print(s)
    show(s:sub(2,-2))
  end
end

show '(grouped (etc))'