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