Lua处理if语句的自定义字符串拆分函数异常失效原因求解
问题根因
你代码的核心问题是firstSplit的开启逻辑没有做唯一触发限制,只要遍历到左括号(就会被重新设为true:
- 你要处理的目标字符串
if (x == 2){ output("Hello") }里存在两个左括号:第一个是if后的条件起始括号,第二个是output函数的调用括号 - 遍历到第二个左括号
(时,代码会再次把firstSplit设为true,而此时后续已经没有=字符可以关闭firstSplit,因此从output的左括号之后所有非(、非=的字符都会被追加到t[1]中,最终导致t[1]结果异常 t[2]逻辑正常是因为secondSplit只有在firstSplit遇到=时才会开启,后续遍历流程没有再触发secondSplit的开启条件,因此不会被重复赋值。
修正方案
可以新增一个标记位限制firstSplit仅被触发一次,或是直接用Lua原生字符串匹配实现更简洁的拆分逻辑,示例代码如下:
local function splitIfStatement(str) local t = {"", "", ""} -- 匹配条件内==左侧的变量名 t[1] = str:match("%(%s*(.-)%s*==") or "" -- 匹配条件内==右侧的数值 t[2] = str:match("==%s*(.-)%s*%)") or "" -- 匹配代码块内的output调用,去除参数保留output()格式 local funcCall = str:match("{%s*(.-)%s*}") or "" t[3] = funcCall:match("(output)%s*%(") .. "()" return t end -- 测试效果 local testStr = 'if (x == 2){ output("Hello") }' local result = splitIfStatement(testStr) print(result[1]) -- 输出 x print(result[2]) -- 输出 2 print(result[3]) -- 输出 output()
内容的提问来源于stack exchange,提问作者Beemo
相关产品推荐
相关产品推荐

