Lua: 子字符串
Lua: substrings
我有一个可以是任何字符的字符串。我喜欢只提取两个感叹号之间的部分或 before 第一个或 after 最后一个:
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"
那么函数应该return nil
您的 getStrPart
功能将非常低效。每次调用它时,都必须搜索整个字符串。最好只 return 一个 table 包含您索引的所有 "string parts"。
此外,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
function getStrPart(str,n) -- return a substring
if n>=0 then
return (
str:gsub("!.*", "%0!")
:gsub("[^!]*!", "", n)
:match("^([^!]*)!")
)
end
end
我有一个可以是任何字符的字符串。我喜欢只提取两个感叹号之间的部分或 before 第一个或 after 最后一个:
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"
那么函数应该return nil
您的 getStrPart
功能将非常低效。每次调用它时,都必须搜索整个字符串。最好只 return 一个 table 包含您索引的所有 "string parts"。
此外,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
function getStrPart(str,n) -- return a substring
if n>=0 then
return (
str:gsub("!.*", "%0!")
:gsub("[^!]*!", "", n)
:match("^([^!]*)!")
)
end
end