myDC.ru

Здравствуйте, гость ( Вход | Регистрация )

 
 
Ответить в данную темуНачать новую тему

> Функция exclude(str,str), Разбивает строку на подстроки по строке и возвращат массив параметров

Теги
Нет тегов для показа
zangriEBP
сообщение 23.4.2009, 14:29
Сообщение #1


Участник
**

Группа: Пользователи
Сообщений: 47
Регистрация: 20.4.2009
Пользователь №: 3 112
Спасибо сказали: 1 раз




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

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

Хочу big_smile.gif
Go to the top of the page
+Quote Post
Setuper
сообщение 23.4.2009, 14:35
Сообщение #2


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Код
string.exclude = function(self, str)
  return {self:match(("(.*)(%s)(.*)"):format(str))}
end
Go to the top of the page
+Quote Post
zangriEBP
сообщение 26.4.2009, 12:45
Сообщение #3


Участник
**

Группа: Пользователи
Сообщений: 47
Регистрация: 20.4.2009
Пользователь №: 3 112
Спасибо сказали: 1 раз




Что-то я не понял как её использовать =\
Go to the top of the page
+Quote Post
Wariner
сообщение 26.4.2009, 12:56
Сообщение #4


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




кажись так надо)))
Код
strl=exclude(str,stre)


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

Код
function test(str,stre)
local strl= exclude(str,stre)
DC():MessageBox(strl[1]..strl[2],"HubsID","yes","question")
end
Go to the top of the page
+Quote Post
zangriEBP
сообщение 26.4.2009, 15:56
Сообщение #5


Участник
**

Группа: Пользователи
Сообщений: 47
Регистрация: 20.4.2009
Пользователь №: 3 112
Спасибо сказали: 1 раз




Спасибо!
Код
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=" " и все =\
Go to the top of the page
+Quote Post
Wariner
сообщение 26.4.2009, 16:30
Сообщение #6


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




мне кажется как то не так работает функция, ибо возвращает она таблицу но в ней не то что нужно!
вот код
Код
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
Go to the top of the page
+Quote Post
Nickolya
сообщение 26.4.2009, 19:52
Сообщение #7


Главный ра******й тут...
*********

Группа: Главные администраторы
Сообщений: 1 727
Регистрация: 18.5.2008
Из: RF, 2la
Пользователь №: 1
Спасибо сказали: 776 раз




Превращает строку ValString типа «ы, ы1, ы5, ы6» в массив. Sep — разделитель элементов © X-Disa, тут источник
Код
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
Go to the top of the page
+Quote Post
Setuper
сообщение 26.4.2009, 23:23
Сообщение #8


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




пардон, я на скорую руку писал big_smile.gif
Go to the top of the page
+Quote Post
zangriEBP
сообщение 27.4.2009, 11:12
Сообщение #9


Участник
**

Группа: Пользователи
Сообщений: 47
Регистрация: 20.4.2009
Пользователь №: 3 112
Спасибо сказали: 1 раз




Спасибо всем!
Думаю тему можно удалить и перенести функцию в тему: "склад полезных функций"
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
Go to the top of the page
+Quote Post
Setuper
сообщение 27.4.2009, 12:43
Сообщение #10


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Немного оптимизированный вариант:
Код
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;
Go to the top of the page
+Quote Post
zangriEBP
сообщение 27.4.2009, 14:49
Сообщение #11


Участник
**

Группа: Пользователи
Сообщений: 47
Регистрация: 20.4.2009
Пользователь №: 3 112
Спасибо сказали: 1 раз




И все же:

/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

...
Go to the top of the page
+Quote Post
Setuper
сообщение 27.4.2009, 15:15
Сообщение #12


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




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
Go to the top of the page
+Quote Post

Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

Collapse

> Похожие темы

  Тема Ответов Автор Просмотров Последнее сообщение
No New Posts Функция Core.SetUserInfo
Работает только в UserConnected?
6 Iskandark 8 428 1.3.2017, 11:16 Посл. сообщение: Iskandark
Closed Функция обновления списка пользователей
...или её альтернатива
2 AlphaOmega 6 052 4.7.2009, 19:08 Посл. сообщение: AlphaOmega
No New Posts Topic has attachmentsФункция Удаления
помогите дописать функцию
3 yMka 6 801 13.2.2009, 14:53 Посл. сообщение: yMka

 



RSS Сейчас: 27.11.2024, 1:57