Lua: 子字符串

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

str = "what)ever!when(ver!time!is!mo/ey"

function getStrPart(str,n) -- 返回一个子字符串
  return str:sub(...) or nil
end

getStrPart(str,0) -- 返回"what)ever"  -- 第一个感叹号之前的字符串
getStrPart(str,1) -- 返回"when(ver"   -- 第一个和第二个感叹号之间的字符串
getStrPart(str,2) -- 返回"time"
getStrPart(str,3) -- 返回"is"
getStrPart(str,4) -- 返回"mo/ey"
getStrPart(str,5) -- 返回nil    -- n 小于0或者大于4 (感叹号的数量)

如果字符串中不包含!,则函数应该返回nil

str = "whatever"
点赞
用户734069
用户734069

你的 getStrPart 函数效率很低。每次调用都需要在整个字符串中进行搜索。最好的方法是返回一个包含所有“字符串部分”的表,以进行索引。

另外,Lua 使用从 1 开始的索引,所以你应该遵循这个规则。

function get_string_parts(str)
  local ret = {}
  for match in str:gmatch("[^!]") do
    if(#match == #str) then -- 没有在字符串中发现 `!`。
      return ret
    end
    ret[#ret + 1] = match
  end
  return ret
end
2018-10-06 13:19:25
用户1847592
用户1847592
### 获取字符串的子串

function getStrPart(str,n) -- 返回一个子串 if n>=0 then return ( str:gsub("!.", "%0!") :gsub("[^!]!", "", n) :match("^([^!]*)!") ) end end


2018-10-06 14:02:28