Lua:子字符串

时间:2018-10-06 09:54:49

标签: regex string lua substring lua-patterns

我有一个可以是任何字符的字符串。我只想提取两个感叹号之间的部分,或者是第一个之前或最后一个之后

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

2 个答案:

答案 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