You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Lua中捕获两个字符串间的所有指定模式匹配结果?

Lua捕获do()与don't()之间的所有指定匹配项

当然可以实现捕获所有匹配项的需求,你的原模式只能拿到第一个匹配,是因为单次string.match只会返回第一个符合条件的结果,而且你的模式逻辑也限制了只能匹配到第一个mul(...)。

解决思路分两步:

  1. 先把do()和don't()之间的内容单独提取出来(或者直接遍历所有do()...don't()块)
  2. 在提取出的内容里,用迭代器遍历所有符合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 00:12:10