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
相关产品推荐
相关产品推荐

