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

Lua运行报bad argument #1 to 'gmatch' (string expected, got nil)求解决

问题根因

报错bad argument #1 to 'gmatch' (string expected, got nil)的触发逻辑非常明确:

  • 代码中调用string.gmatch(str, ...)时,传入的第一个参数str是nil值,而gmatch接口要求第一个参数必须是字符串类型。
  • 现有实现只对第二个参数symbol做了nil默认值处理,完全没校验第一个入参str的合法性,只要调用splitString时漏传第一个参数、或者第一个参数传了nil/非字符串值,就会触发这个报错。
  • 额外逻辑隐患:直接把分隔符symbol拼接到模式匹配规则里,如果分隔符是Lua模式的魔法字符(比如%、.、^、$、(、)、[、]、*、+、-、?),会导致分割逻辑错乱甚至触发其他报错。
修复方案

先补充参数合法性校验,再增加分隔符转义逻辑,修复后的完整代码如下:

-- 内部分隔符转义函数,处理Lua模式魔法字符
local function escapeSymbol(s)
    return (string.gsub(s, "([%^%$%(%)%%%.%[%]%*%+%-%?])", "%%%1"))
end

function splitString(str, symbol)
    -- 校验第一个入参类型,非法直接返回空表,可按需改为抛出明确业务错误
    if type(str) ~= "string" then
        return {}
    end
    -- 处理分隔符默认值+非法值兜底
    if type(symbol) ~= "string" or symbol == "" then
        symbol = "-"
    end

    local tableResult = {}
    local index = 1
    local splitPattern = "([^" .. escapeSymbol(symbol) .. "]+)"
    
    for singleStr in string.gmatch(str, splitPattern) do
        tableResult[index] = singleStr
        index = index + 1
    end

    return tableResult
end
调用注意事项
  • 调用splitString时,第一个参数必须传字符串类型的值,禁止传未初始化的变量、nil值、数字/布尔等非字符串类型值。
  • 修复后支持任意单字符作为分隔符,不会因为分隔符是模式特殊字符出现分割逻辑异常。
  • 如果传入的待分割字符串本身为空字符串,函数会返回空表,符合常规分割逻辑预期。

内容的提问来源于stack exchange,提问作者Junior Miranda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 18:33:26