在lua中使用指定的分隔符拆分字符串

Dro*_*ohi 5 regex lua

我正在尝试在lua中使用分隔符创建一个split()函数,当默认为空格时.默认工作正常.当我给函数分隔符时,问题就开始了.由于某种原因,它不会返回最后一个子字符串.功能:

function split(str,sep)
if sep == nil then
    words = {}
    for word in str:gmatch("%w+") do table.insert(words, word) end
    return words
end
return {str:match((str:gsub("[^"..sep.."]*"..sep, "([^"..sep.."]*)"..sep)))} -- BUG!! doesnt return last value
end
Run Code Online (Sandbox Code Playgroud)

我尝试运行这个:

local str = "a,b,c,d,e,f,g"
local sep = ","
t = split(str,sep)
for i,j in ipairs(t) do
    print(i,j)
end
Run Code Online (Sandbox Code Playgroud)

我得到:

1   a
2   b
3   c
4   d
5   e
6   f
Run Code Online (Sandbox Code Playgroud)

无法弄清楚bug在哪里......

lhf*_*lhf 7

分割字符串时,避免极端情况的最简单方法是将分隔符附加到字符串,当您知道字符串不能以分隔符结束时:

str = "a,b,c,d,e,f,g"
str = str .. ','
for w in str:gmatch("(.-),") do print(w) end
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用带有可选分隔符的模式:

str = "a,b,c,d,e,f,g"
for w in str:gmatch("([^,]+),?") do print(w) end
Run Code Online (Sandbox Code Playgroud)

实际上,我们不需要可选的分隔符,因为我们正在捕获非分隔符:

str = "a,b,c,d,e,f,g"
for w in str:gmatch("([^,]+)") do print(w) end
Run Code Online (Sandbox Code Playgroud)


nic*_*anc 5

这是我的 split() 函数:

-- split("a,b,c", ",") => {"a", "b", "c"}
function split(s, sep)
    local fields = {}
    
    local sep = sep or " "
    local pattern = string.format("([^%s]+)", sep)
    string.gsub(s, pattern, function(c) fields[#fields + 1] = c end)
    
    return fields
end
Run Code Online (Sandbox Code Playgroud)