Lua:子字符串

3

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

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。

谢谢,运行良好。 - Red-Cloud
@Herbert:他不会的。可惜的是,他认为简单的问题应该在评论中得到回答,因此Lua标签下的“未回答”问题列表对于查找真正未回答的问题毫无用处。 - Nicol Bolas
2个回答

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

你说得没错,但在我的特殊情况下,另一种解决方案更合理。不过,我会在另一种情况下使用你的方案。谢谢。 - Red-Cloud

2
function getStrPart(str,n) -- return a substring
  if n>=0 then
    return (
      str:gsub("!.*", "%0!")
         :gsub("[^!]*!", "", n)
         :match("^([^!]*)!")
    )
  end
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接