我有一个可以是任何字符的字符串。我只想提取两个感叹号之间的部分,或者是第一个之前或最后一个之后的
str = "what)ever!when(ver!time!is!mo/ey"
function getStrPart(str,n) -- return a substring
return str:sub(...) or nil
end
getStrPart(str,0) -- return "what)ever" -- string until the first !
getStrPart(str,1) -- return "when(ver" -- between first and second !
getStrPart(str,2) -- return "time"
getStrPart(str,3) -- return "is"
getStrPart(str,4) -- return "mo/ey"
getStrPart(str,5) -- return nil -- for all n less 0 or > 4 (no of the !)
如果字符串不包含!
str = "whatever"
然后函数应返回nil
答案 0 :(得分:2)
您的getStrPart
函数效率极低。每次调用它时,都必须搜索整个字符串。最好只返回包含您索引的所有“字符串部分”的表。
此外,Lua使用基于1的索引,因此您也应该坚持使用该索引。
function get_string_parts(str)
local ret = {}
for match in str:gmatch("[^!]") do
if(#match == #str) then --No `!` found in string.
return ret
end
ret[#ret + 1] = match
end
return ret
end
答案 1 :(得分:2)
function getStrPart(str,n) -- return a substring
if n>=0 then
return (
str:gsub("!.*", "%0!")
:gsub("[^!]*!", "", n)
:match("^([^!]*)!")
)
end
end