Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

MyDC.ru _ Kорзина _ Функция exclude(str,str)

Автор: zangriEBP 23.4.2009, 14:29

Функция exclude(str,str)

Разбивает строку на подстроки по строке и возвращает массив подстрок

Хочу big_smile.gif

Автор: Setuper 23.4.2009, 14:35

Код
string.exclude = function(self, str)
  return {self:match(("(.*)(%s)(.*)"):format(str))}
end

Автор: zangriEBP 26.4.2009, 12:45

Что-то я не понял как её использовать =\

Автор: Wariner 26.4.2009, 12:56

кажись так надо)))

Код
strl=exclude(str,stre)


да и вообще зачем лишние действия

Код
function test(str,stre)
local strl= exclude(str,stre)
DC():MessageBox(strl[1]..strl[2],"HubsID","yes","question")
end

Автор: zangriEBP 26.4.2009, 15:56

Спасибо!

Код
function test(str,stre)
local strl=str:exclude(stre)
DC():MessageBox(strl[1]..strl[2],"HubsID","yes","question")
end

Я здесь обнаружил что функция нестабильна:
/lua test("a-_b-_c-_e-_f","-_") -- вернет "a-_b-_c-_e-_"
Она вобще работает тока с stre=" " и все =\

Автор: Wariner 26.4.2009, 16:30

мне кажется как то не так работает функция, ибо возвращает она таблицу но в ней не то что нужно!
вот код

Код
function OnStartup()
    test("a-_b-_c-_e-_f", "-_")
end
    
function test(str,stre)
    local strl = {}
    strl = str:exclude(stre)
    for i,v in pairs(strl) do
        Core.SendToAll(i.."     "..v)
    end    
end

string.exclude = function(self, str)
  return {self:match(("(.*)(%s)(.*)"):format(str))}
end


а вот результат
Цитата
[17:26:31] 1 a-_b-_c-_e
[17:26:31] 2 -_
[17:26:31] 3 f

Автор: Nickolya 26.4.2009, 19:52

Превращает строку ValString типа «ы, ы1, ы5, ы6» в массив. Sep — разделитель элементов © X-Disa, http://mydc.ru/r/?http://forum.proc.ru/index.php?showtopic=35898&view=findpost&p=637847

Код
function array_explode(ValString,Sep)
  if (string.find(ValString,Sep,1,false)) then
    local retarr = {}
    local s = 1
    local e = 0
    local fnd = ""
    local snd = ""
    local iii = 0
    ValString = ValString..Sep
      while (s) do
        s,e,fnd = string.find(ValString,"(.-)"..Sep.."+",e+1,false)
        if (fnd ~= nil and fnd ~= "") then
          table.insert(retarr,fnd)
        end
        iii = iii + 1
      end
    return retarr
  else
    return {ValString}
  end
end

Автор: Setuper 26.4.2009, 23:23

пардон, я на скорую руку писал big_smile.gif

Автор: zangriEBP 27.4.2009, 11:12

Спасибо всем!
Думаю тему можно удалить и перенести функцию в тему: "склад полезных функций"

CODE
string.explode = function (ValString,Sep)
if (string.find(ValString,Sep,1,false)) then
local retarr = {}
local s = 1
local e = 0
local fnd = ""
local snd = ""
local iii = 0
ValString = ValString..Sep
while (s) do
s,e,fnd = string.find(ValString,"(.-)"..Sep.."+",e+1,false)
if (fnd ~= nil and fnd ~= "") then
table.insert(retarr,fnd)
end
iii = iii + 1
end
return retarr
else
return {ValString}
end
end

Автор: Setuper 27.4.2009, 12:43

Немного оптимизированный вариант:

Код
string.explode = function(self, Sep)
  self = self..Sep
  local ret, pref, suff = {}, self:match(("(.-)%s+(.*)"):format(Sep))
  while pref do
    table.insert(ret, pref)
    pref, suff = suff:match(("(.-)%s+(.*)"):format(Sep))
  end
  return ret
end



Я так понимаю, что данная функция нужна была для разбора команд протокола.
Вот похожая функция моего скрипта big_smile.gif :
Код
--[[  \fn self:Cmds(sData, sId, iIp, sNick)
*     \bref Partition the received command
*     \param sData - cmd, sId - user's id, iIp - user's ip, sNick - user's nick
*     \return true or false
]]
Cmds = function(self, sData, sId, iIp, sNick)
  sData = sData.."|"
  local pref, suff = sData:match"(.-)|+(.*)"
  while pref do
    if not self:Cmd(pref, sId, iIp, sNick) then
      return false
    end
    pref, suff = suff:match"(.-)|+(.*)"
  end
  return true
end;

Автор: zangriEBP 27.4.2009, 14:49

И все же:

/lua test("_+a_+b_+c_+d","_+") -- (strl[1]..strl[2]..strl[3]..strl[4]) -- вернет abc
/lua test("a_+b_+c_+d","_+") -- (strl[1]..strl[2]..strl[3]..strl[4]) -- вернет abcd

...

Автор: Setuper 27.4.2009, 15:15

1) /lua test("_+a_+b_+c_+d","_+") -- (strl[1]..strl[2]..strl[3]..strl[4]..strl[5]) -- вернет abcd
2) /lua test("a_+b_+c_+d","_+") -- (strl[1]..strl[2]..strl[3]..strl[4]) -- вернет abcd

Код
-- 1)
strl[1] = ""
strl[2] = "a"
strl[3] = "b"
strl[4] = "c"
strl[5] = "d"

-- 2)
strl[1] = "a"
strl[2] = "b"
strl[3] = "c"
strl[4] = "d"


Если не нравится наличие пустой строки, то достаточно заменить
Код
table.insert(ret, pref)
на
Код
if pref ~= '' then table.insert(ret, pref) end