【问题标题】:Lua: substringsLua:子字符串
【发布时间】:2019-03-11 16:21:55
【问题描述】:

我有一个可以是任何字符的字符串。我喜欢只提取两个感叹号之间的部分或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"  

那么函数应该返回 nil

【问题讨论】:

  • 谢谢,工作正常。请给它作为答案,请
  • @Herbert:他不会。不幸的是,他认为应该在 cmets 中回答简单的问题,因此 Lua 标签的“未回答”问题列表对于查找实际上未回答的问题完全没有用处。

标签: regex string lua substring lua-patterns


【解决方案1】:
function getStrPart(str,n) -- return a substring
  if n>=0 then
    return (
      str:gsub("!.*", "%0!")
         :gsub("[^!]*!", "", n)
         :match("^([^!]*)!")
    )
  end
end

【讨论】:

    【解决方案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
    

    【讨论】:

    • 你是对的,但在我的特殊情况下,其他解决方案更有意义。但是,我会在另一种情况下使用你的。谢谢
    猜你喜欢
    • 2019-04-23
    • 2015-01-16
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    相关资源
    最近更新 更多