如何在Lua中捕获两个字符串间的所有指定模式匹配结果?
Lua捕获do()与don't()之间的所有指定匹配项
当然可以实现捕获所有匹配项的需求,你的原模式只能拿到第一个匹配,是因为单次string.match只会返回第一个符合条件的结果,而且你的模式逻辑也限制了只能匹配到第一个mul(...)。
解决思路分两步:
- 先把
do()和don't()之间的内容单独提取出来(或者直接遍历所有do()...don't()块) - 在提取出的内容里,用迭代器遍历所有符合
mul(%d+,%d+)的匹配项
单块场景示例
如果你的字符串里只有一组do()...don't(),可以这么写:
local input_str = "do()mul(41,51)mul(1,1)don't()" -- 提取do()到don't()之间的全部内容 local inner_content = string.match(input_str, "do%(%)(.*)don't%(%))") if inner_content then -- 遍历所有符合规则的mul表达式 for matched_item in string.gmatch(inner_content, "mul%(%d+,%d+%)") do print(matched_item) -- 会依次输出mul(41,51)、mul(1,1) end end
多块场景示例
如果字符串里有多组do()...don't(),可以先遍历每个块再处理:
local input_str = "do()mul(2,3)mul(4,5)don't()do()mul(6,7)don't()" -- 逐个提取每个do()...don't()块内的内容 for block_content in string.gmatch(input_str, "do%(%)(.-)don't%(%))") do -- 遍历当前块内的所有mul表达式 for matched_item in string.gmatch(block_content, "mul%(%d+,%d+%)") do print(matched_item) -- 输出mul(2,3)、mul(4,5)、mul(6,7) end end
为什么原模式不行?
你的原模式do%(%).-(mul%(%d+%,%d+%))[don't%(%)]?用了.-非贪婪匹配,找到第一个mul(...)后就会停止匹配;而且string.match本身只能返回第一个匹配的捕获结果,没法一次性拿到所有符合条件的项。通过先锁定范围再迭代遍历,就能轻松拿到所有匹配项了。
内容的提问来源于stack exchange,提问作者dev-rifaii
相关产品推荐
相关产品推荐

