Lua: подстроки - PullRequest
       21

Lua: подстроки

0 голосов
/ 06 октября 2018

У меня есть строка, которая может состоять из любых символов.Мне нравится извлекать только часть между двумя восклицательными знаками или до первого или после последнего:

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 голосов
/ 06 октября 2018
function getStrPart(str,n) -- return a substring
  if n>=0 then
    return (
      str:gsub("!.*", "%0!")
         :gsub("[^!]*!", "", n)
         :match("^([^!]*)!")
    )
  end
end
0 голосов
/ 06 октября 2018

Ваша 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
...