模式不匹配 *(%(*.%))
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))'
我正在尝试从 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))'