如何在Lua分割字符串时保留空条目并输出nil?
Lua分割字符串保留空条目实现方法
原代码使用string.gmatch配合正则([^,'',%s]+)时,会跳过逗号之间的空内容——因为这个正则只匹配至少一个非逗号、非空白的字符,两个连续逗号之间的空部分自然会被忽略。要保留空条目并输出nil,可以用以下两种方法:
方法一:修改正则表达式匹配所有分隔段
把正则改成([^,]*),这个表达式会匹配任意数量(包括0个)的非逗号字符,也就是每个逗号分隔的部分(包括空内容)。遍历的时候把空字符串替换成nil输出,同时统计总条目数避免末尾多余的空字符串:
str = "cat,dog,,horse" -- 统计总条目数(条目数比分隔符数量多1) local item_count = 1 for _ in string.gmatch(str, ",") do item_count = item_count + 1 end local current_idx = 0 for word in string.gmatch(str, "([^,]*)") do current_idx = current_idx + 1 if current_idx > item_count then break end -- 空字符串输出nil,否则输出原内容 print(word == "" and nil or word) end
输出结果:
cat dog nil horse
方法二:手动遍历分割字符串
不用正则,直接通过string.find循环查找逗号位置,逐个截取分隔段,逻辑更直观:
str = "cat,dog,,horse" local start_pos = 1 while true do -- 查找下一个逗号的位置 local comma_pos = string.find(str, ",", start_pos) local segment if comma_pos then -- 截取当前到逗号前的部分 segment = string.sub(str, start_pos, comma_pos - 1) start_pos = comma_pos + 1 else -- 截取最后一段 segment = string.sub(str, start_pos) end -- 空段输出nil print(segment == "" and nil or segment) -- 没有逗号时退出循环 if not comma_pos then break end end
输出结果同样符合需求:
cat dog nil horse
内容的提问来源于stack exchange,提问作者mathsbeauty
相关产品推荐
相关产品推荐

