Исходник Strings \\ Новые методы строк в Lua

Cosmo

Известный
Автор темы
Друг
644
2,581
» Strings.lua

Приветствую, хочу представить вам свою первую библиотеку. Её задача - это расширение стандартного набора функций для работы со строковыми типами данных, так как в Lua на этот счёт всё довольно скучненько ( string.sub/gsub/gmatch/find/и т.д ), и лично мне порой часто не хватало тех или иных возможностей, которыми могут похвастаться другие языки программирования. Давайте перейдём ближе к делу..

Для начала работы с библиотекой вам понадобится лишь подключить её в начале своего скрипта:
Подключение библиотеки:
require "strings"
Готово, библиотека подключена и новые функции для строк уже готовы для работы.

Работать с новыми функциями вы можете в двух способах:
1) Через string ( Например: string.count(text, ... ) )
2) Используя метод ( Например: text:count( ... ) )


Полный список функций:
string.insert(str, implant[, pos]) — Вставляет текст в строку на указанную позицию
string.extract(str, pattern) — Вырезает указанный текст из строки
string.array(str) — Преобразует строку в массив
string.isEmpty(str) — Проверяет, пустая ли строка или состоит только из пробелов
string.isDigit(str) — Проверяет, состоит ли строка только из цифр
string.isAlpha(str) — Проверяет, состоит ли строка только из букв
string.split(str[, plain]) — Разбивает строку по указанному паттерну
string.lower(str) — Стандартная функция Lua, но с поддержкой кириллицы
string.upper(str) — Стандартная функция Lua, но с поддержкой кириллицы
string.isSpace(str) — Проверяет, состоит ли строка из невидимых символов (пробелы, управляющие символы)
string.isUpper(str) — Проверяет, написана ли строка в верхнем регистре
string.isLower(str) — Проверяет, написана ли строка в нижнем регистре
string.isSimilar(str) — Проверяет, одинаковые ли строки
string.isTitle(str) — Проверяет, что первая буква в строке заглавная
string.startsWith(str, prefix) — Проверяет, начинается ли строка с..
string.endsWith(str, suffix) — Проверяет, заканчивается ли строка этим..
string.capitalize(str) — Делает первую букву в строке заглавной
string.tabsToSpace(str[, count]) — Преобразует табуляции в указанное количество пробелов
string.spaceToTabs(str[, count]) — Преобразует указанное количество пробелов подряд в табуляцию
string.center(str, width[, char]) — Заполняет строку символами (по умолчанию пробел) и выравнивает в них текст по центру
string.count(str, search[, start[, end]]) — Считает совпадения в строке
string.trim(str) — Обрезает пробелы в начале и в конце строки
string.trimEnd(str) — Обрезает пробелы в конце строки
string.trimStart(str) — Обрезает пробелы в начале строки
string.swapCase(str) — Меняет регистр символов в строке местами
string.splitEqually(str, width) — Делит строку на N одинаковых частей
string.rFind(str, pattern[, pos[, plain]]) — Аналог string.find, но поиск начинается с конца
string.wrap(str, width) — Переносит строку если она достигла N длины
string.levDist(str) — Вычисляет расстояние Дамерау-Левенштейна
string.getSimilarity(str, str1) — Возвращает сходство между строками от 0 до 1 (где 0 это абсолютно разные строки, а 1 - абсолютно одинаковые)
string.empty() — Возвращает пустую строку
string.toCamel(str) — Возвращает текст в ВеРбЛюЖеМ РеГиСтРе
string.shuffle(str[, seed]) — Перемешивает все символы в рандомном порядке
string.unplain(str) — Экранирует regex-символы в строке (new)
string.cutLimit(str, max_len[, ending]) — Обрезает строку с конца по указанному кол-ву символов (new)
string.switchLayout(str) — Заменяет раскладку с RU на EN или наоборот (new)

Вот несколько примеров, как и что можно сделать используя эти функции:
Разделение строки равные части по 2 символа:
local string = "Looooooooooooooooooong"

local arr = string:splitEqually(2)
print( table.concat(arr, " | ") )

-- Output: Lo | oo | oo | oo | oo | oo | oo | oo | oo | oo | ng

Перенос строк:
local text = "Пришёл мужик на рынок, видит шляпу. Надевает, а она ему как раз!"
print( string.wrap(text, 15) )

-- Output:
-- Пришёл мужик на
-- рынок, видит
-- шляпу.
-- Надевает, а она
-- ему как раз!

Сравнение строк на сходство:
local str_1 = "Привет мир!"
local str_2 = "Привіт світ!"

local diff = string.getSimilarity(str_1, str_2)
print( ("Строки идентичны на %d%%"):format(diff * 100) )

-- Output: Строки идентичны на 58%

Проверка на окончание строки:
local path = "C:\\Images\\icon.txt"

if not path:endsWith(".png") then
    print("File is not PNG image!")
end

-- Output: File is not PNG image!

Узнаём количество определённых букв в тексте:
local text = "Каждый охотник желает знать где сидит фазан"
print( text:count("а") )

-- Output: 5
Если не хотите зависеть от библиотеки, то вставьте это начало своего скрипта. Здесь вся библиотека в одной строке
Strings minified:
do local a=getmetatable("String")function a.__index:insert(b,c)if c==nil then return self..b end;return self:sub(1,c)..b..self:sub(c+1)end;function a.__index:extract(d)self=self:gsub(d,"")return self end;function a.__index:array()local e={}for f in self:gmatch(".")do e[#e+1]=f end;return e end;function a.__index:isEmpty()return self:find("%S")==nil end;function a.__index:isDigit()return self:find("%D")==nil end;function a.__index:isAlpha()return self:find("[%d%p]")==nil end;function a.__index:split(g,h)local i,c={},1;repeat local f,j=self:find(g or" ",c,h)local k=self:sub(c,f and f-1)if k~=""then i[#i+1]=k end;c=j and j+1 until c==nil;return i end;local l=string.lower;function a.__index:lower()for m=192,223 do self=self:gsub(string.char(m),string.char(m+32))end;self=self:gsub(string.char(168),string.char(184))return l(self)end;local n=string.upper;function a.__index:upper()for m=224,255 do self=self:gsub(string.char(m),string.char(m-32))end;self=self:gsub(string.char(184),string.char(168))return n(self)end;function a.__index:isSpace()return self:find("^[%s%c]*$")~=nil end;function a.__index:isUpper()return self:upper()==self end;function a.__index:isLower()return self:lower()==self end;function a.__index:isSimilar(o)return self==o end;function a.__index:isTitle()local p=self:find("[A-zА-яЁё]")local q=self:sub(p,p)return q:isSimilar(q:upper())end;function a.__index:startsWith(o)return self:sub(1,#o):isSimilar(o)end;function a.__index:endsWith(o)return self:sub(#self-#o+1,#self):isSimilar(o)end;function a.__index:capitalize()local r=self:sub(1,1):upper()self=self:gsub("^.",r)return self end;function a.__index:tabsToSpace(s)local t=(" "):rep(s or 4)self=self:gsub("\t",t)return self end;function a.__index:spaceToTabs(s)local t=(" "):rep(s or 4)self=self:gsub(t,"\t")return self end;function a.__index:center(u,v)local w=u-#self;local f=string.rep(v or" ",w)return f:insert(self,math.ceil(w/2))end;function a.__index:count(x,y,z)local A=self:sub(y or 1,z or#self)local s,c=0,y or 1;repeat local f,j=A:find(x,c,true)s=f and s+1 or s;c=j and j+1 until c==nil;return s end;function a.__index:trimEnd()self=self:gsub("%s*$","")return self end;function a.__index:trimStart()self=self:gsub("^%s*","")return self end;function a.__index:trim()self=self:match("^%s*(.-)%s*$")return self end;function a.__index:swapCase()local i={}for f in self:gmatch(".")do if f:isAlpha()then f=f:isLower()and f:upper()or f:lower()end;i[#i+1]=f end;return table.concat(i)end;function a.__index:splitEqually(u)assert(u>0,"Width less than zero")if u>=self:len()then return{self}end;local i,m={},1;repeat if#i==0 or#i[#i]>=u then i[#i+1]=""end;i[#i]=i[#i]..self:sub(m,m)m=m+1 until m>#self;return i end;function a.__index:rFind(d,c,h)local m=c or#self;repeat local i={self:find(d,m,h)}if next(i)~=nil then return table.unpack(i)end;m=m-1 until m<=0;return nil end;function a.__index:wrap(u)assert(u>0,"Width less than zero")assert(u<self:len(),"Width is greater than the string length")local c=1;self=self:gsub("(%s+)()(%S+)()",function(B,C,D,E)if E-c>(u or 72)then c=C;return"\n"..D end end)return self end;function a.__index:levDist(o)if#self==0 then return#o elseif#o==0 then return#self elseif self==o then return 0 end;local F=0;local G={}for m=0,#self do G[m]={}G[m][0]=m end;for m=0,#o do G[0][m]=m end;for m=1,#self,1 do for H=1,#o,1 do F=self:byte(m)==o:byte(H)and 0 or 1;G[m][H]=math.min(G[m-1][H]+1,G[m][H-1]+1,G[m-1][H-1]+F)end end;return G[#self][#o]end;function a.__index:getSimilarity(o)local I=self:levDist(o)return 1-I/math.max(#self,#o)end;function a.__index:empty()return""end;function a.__index:toCamel()local J=self:array()for m,q in ipairs(J)do J[m]=m%2==0 and q:lower()or q:upper()end;return table.concat(J)end;function a.__index:unplain()local J=self:array()for m,q in ipairs(J)do if q:find("().%+-*?[]^$",1,true)then J[m]="%"..q end end;return table.concat(J)end;function a.__index:shuffle(K)math.randomseed(K or os.time())local J=self:array()for m=#J,2,-1 do local H=math.random(m)J[m],J[H]=J[H],J[m]end;return table.concat(J)end;function a.__index:cutLimit(L,M)assert(L>0,"Maximum length cannot be less than or equal to 1")if#self>0 and#self>L then M=M or".."self=self:sub(1,L)..M end;return self end;function a.__index:switchLayout()local i=""local N=self:find("^[%s%p]*%a")~=nil;local k={{"а","f"},{"б",","},{"в","d"},{"г","u"},{"д","l"},{"е","t"},{"ё","`"},{"ж",";"},{"з","p"},{"и","b"},{"й","q"},{"к","r"},{"л","k"},{"м","v"},{"н","y"},{"о","j"},{"п","g"},{"р","h"},{"с","c"},{"т","n"},{"у","e"},{"ф","a"},{"х","["},{"ц","w"},{"ч","x"},{"ш","i"},{"щ","o"},{"ь","m"},{"ы","s"},{"ъ","]"},{"э","'"},{"/","."},{"я","z"},{"А","F"},{"Б","<"},{"В","D"},{"Г","U"},{"Д","L"},{"Е","T"},{"Ё","~"},{"Ж",":"},{"З","P"},{"И","B"},{"Й","Q"},{"К","R"},{"Л","K"},{"М","V"},{"Н","Y"},{"О","J"},{"П","G"},{"Р","H"},{"С","C"},{"Т","N"},{"У","E"},{"Ф","A"},{"Х","{"},{"Ц","W"},{"Ч","X"},{"Ш","I"},{"Щ","O"},{"Ь","M"},{"Ы","S"},{"Ъ","}"},{"Э","\""},{"Ю",">"},{"Я","Z"}}for O in self:gmatch(".")do local P=false;for Q,R in ipairs(k)do if O==R[N and 2 or 1]then O=R[N and 1 or 2]P=true;break end end;if not P then for Q,R in ipairs(k)do if O==R[N and 1 or 2]then O=R[N and 2 or 1]break end end end;i=i..O end;return i end end

GitHub: https://github.com/c0sui/lua_strings
 

Вложения

  • strings.lua
    7.2 KB · Просмотры: 182
Последнее редактирование:

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,747
11,157
лайфхак что бы не тянуть за собой файл
Lua:
-->> str lib (https://www.blast.hk/threads/147968/) <<--
local mt = getmetatable("String") function mt.__index:insert(implant, pos)     if pos == nil then         return self .. implant     end     return self:sub(1, pos) .. implant .. self:sub(pos + 1) end  function mt.__index:extract(pattern)     self = self:gsub(pattern, "")     return self end  function mt.__index:array()     local array = {}     for s in self:sub(".") do         array[#array + 1] = s     end     return array end  function mt.__index:isEmpty()     return self:find("%S") == nil end  function mt.__index:isDigit()     return self:find("%D") == nil end  function mt.__index:isAlpha()     return self:find("[%d%p]") == nil end  function mt.__index:split(sep, plain)     assert(not sep:isEmpty(), "Empty separator")         result, pos = {}, 1     repeat         local s, f = self:find(sep or " ", pos, plain)         result[#result + 1] = self:sub(pos, s and s - 1)         pos = f and f + 1     until pos == nil     return result end  local orig_lower = string.lower function mt.__index:lower()     for i = 192, 223 do         self = self:gsub(string.char(i), string.char(i + 32))     end     self = self:gsub(string.char(168), string.char(184))     return orig_lower(self) end  local orig_upper = string.upper function mt.__index:upper()     for i = 224, 255 do         self = self:gsub(string.char(i), string.char(i - 32))     end     self = self:gsub(string.char(184), string.char(168))     return orig_upper(self) end  function mt.__index:isSpace()     return self:find("^[%s%c]+$") ~= nil end  function mt.__index:isUpper()     return self:upper() == self end  function mt.__index:isLower()     return self:lower() == self end  function mt.__index:isSimilar(str)     return self == str end  function mt.__index:isTitle()     local p = self:find("[A-zА-яЁё]")     local let = self:sub(p, p)     return let:isSimilar(let:upper()) end  function mt.__index:startsWith(str)     return self:sub(1, #str):isSimilar(str) end  function mt.__index:endsWith(str)     return self:sub(#self - #str + 1, #self):isSimilar(str) end  function mt.__index:capitalize()     local cap = self:sub(1, 1):upper()     self = self:gsub("^.", cap)     return self end  function mt.__index:tabsToSpace(count)     local spaces = (" "):rep(count or 4)     self = self:gsub("\t", spaces)     return self end  function mt.__index:spaceToTabs(count)     local spaces = (" "):rep(count or 4)     self = self:gsub(spaces, "t")     return self end  function mt.__index:center(width, char)     local len = width - #self     local s = string.rep(char or " ", len)      return s:insert(self, math.ceil(len / 2)) end  function mt.__index:count(search, p1, p2)     assert(not search:isEmpty(), "Empty search")     local area = self:sub(p1 or 1, p2 or #self)     local count, pos = 0, p1 or 1     repeat         local s, f = area:find(search, pos, true)         count = s and count + 1 or count         pos = f and f + 1     until pos == nil     return count end  function mt.__index:trimEnd()     self = self:gsub("%s*$", "")     return self end  function mt.__index:trimStart()     self = self:gsub("^%s*", "")     return self end  function mt.__index:trim()     self = self:match("^%s*(.-)%s*$")     return self end  function mt.__index:swapCase()     local result = {}     for s in self:gmatch(".") do         if s:isAlpha() then             s = s:isLower() and s:upper() or s:lower()         end         result[#result + 1] = s     end     return table.concat(result) end  function mt.__index:splitEqually(width)     assert(width > 0, "Width less than zero")     assert(width <= self:len(), "Width is greater than the string length")     local result, i = {}, 1     repeat         if #result == 0 or #result[#result] >= width then             result[#result + 1] = ""         end         result[#result] = result[#result] .. self:sub(i, i)         i = i + 1     until i > #self     return result end  function mt.__index:rFind(pattern, pos, plain)     local i = pos or #self     repeat         local result = { self:find(pattern, i, plain) }         if next(result) ~= nil then             return table.unpack(result)         end         i = i - 1     until i <= 0     return nil end  function mt.__index:wrap(width)     assert(width > 0, "Width less than zero")     assert(width < self:len(), "Width is greater than the string length")     local pos = 1     self = self:gsub("(%s+)()(%S+)()", function(sp, st, word, fi)         if fi - pos > (width or 72) then             pos = st             return "\n" .. word         end     end)        return self end  function mt.__index:levDist(str)     if #self == 0 then         return #str     elseif #str == 0 then         return #self     elseif self == str then         return 0     end          local cost = 0     local matrix = {}     for i = 0, #self do matrix[i] = {}; matrix[i][0] = i end     for i = 0, #str do matrix[0][i] = i end     for i = 1, #self, 1 do         for j = 1, #str, 1 do             cost = self:byte(i) == str:byte(j) and 0 or 1             matrix[i][j] = math.min(                 matrix[i - 1][j] + 1,                 matrix[i][j - 1] + 1,                 matrix[i - 1][j - 1] + cost             )         end     end     return matrix[#self][#str] end  function mt.__index:getSimilarity(str)     local dist = self:levDist(str)     return 1 - dist / math.max(#self, #str) end
1661788644807.png
 

triazov

Активный
250
57
лайфхак что бы не тянуть за собой файл
Lua:
-->> str lib (https://www.blast.hk/threads/147968/) <<--
local mt = getmetatable("String") function mt.__index:insert(implant, pos)     if pos == nil then         return self .. implant     end     return self:sub(1, pos) .. implant .. self:sub(pos + 1) end  function mt.__index:extract(pattern)     self = self:gsub(pattern, "")     return self end  function mt.__index:array()     local array = {}     for s in self:sub(".") do         array[#array + 1] = s     end     return array end  function mt.__index:isEmpty()     return self:find("%S") == nil end  function mt.__index:isDigit()     return self:find("%D") == nil end  function mt.__index:isAlpha()     return self:find("[%d%p]") == nil end  function mt.__index:split(sep, plain)     assert(not sep:isEmpty(), "Empty separator")         result, pos = {}, 1     repeat         local s, f = self:find(sep or " ", pos, plain)         result[#result + 1] = self:sub(pos, s and s - 1)         pos = f and f + 1     until pos == nil     return result end  local orig_lower = string.lower function mt.__index:lower()     for i = 192, 223 do         self = self:gsub(string.char(i), string.char(i + 32))     end     self = self:gsub(string.char(168), string.char(184))     return orig_lower(self) end  local orig_upper = string.upper function mt.__index:upper()     for i = 224, 255 do         self = self:gsub(string.char(i), string.char(i - 32))     end     self = self:gsub(string.char(184), string.char(168))     return orig_upper(self) end  function mt.__index:isSpace()     return self:find("^[%s%c]+$") ~= nil end  function mt.__index:isUpper()     return self:upper() == self end  function mt.__index:isLower()     return self:lower() == self end  function mt.__index:isSimilar(str)     return self == str end  function mt.__index:isTitle()     local p = self:find("[A-zА-яЁё]")     local let = self:sub(p, p)     return let:isSimilar(let:upper()) end  function mt.__index:startsWith(str)     return self:sub(1, #str):isSimilar(str) end  function mt.__index:endsWith(str)     return self:sub(#self - #str + 1, #self):isSimilar(str) end  function mt.__index:capitalize()     local cap = self:sub(1, 1):upper()     self = self:gsub("^.", cap)     return self end  function mt.__index:tabsToSpace(count)     local spaces = (" "):rep(count or 4)     self = self:gsub("\t", spaces)     return self end  function mt.__index:spaceToTabs(count)     local spaces = (" "):rep(count or 4)     self = self:gsub(spaces, "t")     return self end  function mt.__index:center(width, char)     local len = width - #self     local s = string.rep(char or " ", len)      return s:insert(self, math.ceil(len / 2)) end  function mt.__index:count(search, p1, p2)     assert(not search:isEmpty(), "Empty search")     local area = self:sub(p1 or 1, p2 or #self)     local count, pos = 0, p1 or 1     repeat         local s, f = area:find(search, pos, true)         count = s and count + 1 or count         pos = f and f + 1     until pos == nil     return count end  function mt.__index:trimEnd()     self = self:gsub("%s*$", "")     return self end  function mt.__index:trimStart()     self = self:gsub("^%s*", "")     return self end  function mt.__index:trim()     self = self:match("^%s*(.-)%s*$")     return self end  function mt.__index:swapCase()     local result = {}     for s in self:gmatch(".") do         if s:isAlpha() then             s = s:isLower() and s:upper() or s:lower()         end         result[#result + 1] = s     end     return table.concat(result) end  function mt.__index:splitEqually(width)     assert(width > 0, "Width less than zero")     assert(width <= self:len(), "Width is greater than the string length")     local result, i = {}, 1     repeat         if #result == 0 or #result[#result] >= width then             result[#result + 1] = ""         end         result[#result] = result[#result] .. self:sub(i, i)         i = i + 1     until i > #self     return result end  function mt.__index:rFind(pattern, pos, plain)     local i = pos or #self     repeat         local result = { self:find(pattern, i, plain) }         if next(result) ~= nil then             return table.unpack(result)         end         i = i - 1     until i <= 0     return nil end  function mt.__index:wrap(width)     assert(width > 0, "Width less than zero")     assert(width < self:len(), "Width is greater than the string length")     local pos = 1     self = self:gsub("(%s+)()(%S+)()", function(sp, st, word, fi)         if fi - pos > (width or 72) then             pos = st             return "\n" .. word         end     end)        return self end  function mt.__index:levDist(str)     if #self == 0 then         return #str     elseif #str == 0 then         return #self     elseif self == str then         return 0     end          local cost = 0     local matrix = {}     for i = 0, #self do matrix[i] = {}; matrix[i][0] = i end     for i = 0, #str do matrix[0][i] = i end     for i = 1, #self, 1 do         for j = 1, #str, 1 do             cost = self:byte(i) == str:byte(j) and 0 or 1             matrix[i][j] = math.min(                 matrix[i - 1][j] + 1,                 matrix[i][j - 1] + 1,                 matrix[i - 1][j - 1] + cost             )         end     end     return matrix[#self][#str] end  function mt.__index:getSimilarity(str)     local dist = self:levDist(str)     return 1 - dist / math.max(#self, #str) end
Посмотреть вложение 165918
я тут подумал, а нахуй вообще библиотеки качать, ты же просто ебанный гений
 

Jora2412

Новичок
12
0
код:
Lua:
-->> str lib (https://www.blast.hk/threads/147968/) <<--
do local a=getmetatable("String")function a.__index:insert(b,pos)if pos==nil then return self..b end;return self:sub(1,pos)..b..self:sub(pos+1)end;function a.__index:extract(c)self=self:gsub(c,"")return self end;function a.__index:array()local d={}for e in self:gmatch(".")do d[#d+1]=e end;return d end;function a.__index:isEmpty()return self:find("%S")==nil end;function a.__index:isDigit()return self:find("%D")==nil end;function a.__index:isAlpha()return self:find("[%d%p]")==nil end;function a.__index:split(f,g)assert(not f:isEmpty(),"Empty separator")result,pos={},1;repeat local e,h=self:find(f or" ",pos,g)result[#result+1]=self:sub(pos,e and e-1)pos=h and h+1 until pos==nil;return result end;local i=string.lower;function a.__index:lower()for j=192,223 do self=self:gsub(string.char(j),string.char(j+32))end;self=self:gsub(string.char(168),string.char(184))return i(self)end;local k=string.upper;function a.__index:upper()for j=224,255 do self=self:gsub(string.char(j),string.char(j-32))end;self=self:gsub(string.char(184),string.char(168))return k(self)end;function a.__index:isSpace()return self:find("^[%s%c]+$")~=nil end;function a.__index:isUpper()return self:upper()==self end;function a.__index:isLower()return self:lower()==self end;function a.__index:isSimilar(l)return self==l end;function a.__index:isTitle()local m=self:find("[A-zА-яЁё]")local n=self:sub(m,m)return n:isSimilar(n:upper())end;function a.__index:startsWith(l)return self:sub(1,#l):isSimilar(l)end;function a.__index:endsWith(l)return self:sub(#self-#l+1,#self):isSimilar(l)end;function a.__index:capitalize()local o=self:sub(1,1):upper()self=self:gsub("^.",o)return self end;function a.__index:tabsToSpace(p)local q=(" "):rep(p or 4)self=self:gsub("\t",q)return self end;function a.__index:spaceToTabs(p)local q=(" "):rep(p or 4)self=self:gsub(q,"t")return self end;function a.__index:center(r,s)local t=r-#self;local e=string.rep(s or" ",t)return e:insert(self,math.ceil(t/2))end;function a.__index:count(u,v,w)assert(not u:isEmpty(),"Empty search")local x=self:sub(v or 1,w or#self)local p,pos=0,v or 1;repeat local e,h=x:find(u,pos,true)p=e and p+1 or p;pos=h and h+1 until pos==nil;return p end;function a.__index:trimEnd()self=self:gsub("%s*$","")return self end;function a.__index:trimStart()self=self:gsub("^%s*","")return self end;function a.__index:trim()self=self:match("^%s*(.-)%s*$")return self end;function a.__index:swapCase()local result={}for e in self:gmatch(".")do if e:isAlpha()then e=e:isLower()and e:upper()or e:lower()end;result[#result+1]=e end;return table.concat(result)end;function a.__index:splitEqually(r)assert(r>0,"Width less than zero")assert(r<=self:len(),"Width is greater than the string length")local result,j={},1;repeat if#result==0 or#result[#result]>=r then result[#result+1]=""end;result[#result]=result[#result]..self:sub(j,j)j=j+1 until j>#self;return result end;function a.__index:rFind(c,pos,g)local j=pos or#self;repeat local result={self:find(c,j,g)}if next(result)~=nil then return table.unpack(result)end;j=j-1 until j<=0;return nil end;function a.__index:wrap(r)assert(r>0,"Width less than zero")assert(r<self:len(),"Width is greater than the string length")local pos=1;self=self:gsub("(%s+)()(%S+)()",function(y,z,A,B)if B-pos>(r or 72)then pos=z;return"\n"..A end end)return self end;function a.__index:levDist(l)if#self==0 then return#l elseif#l==0 then return#self elseif self==l then return 0 end;local C=0;local D={}for j=0,#self do D[j]={}D[j][0]=j end;for j=0,#l do D[0][j]=j end;for j=1,#self,1 do for E=1,#l,1 do C=self:byte(j)==l:byte(E)and 0 or 1;D[j][E]=math.min(D[j-1][E]+1,D[j][E-1]+1,D[j-1][E-1]+C)end end;return D[#self][#l]end;function a.__index:getSimilarity(l)local F=self:levDist(l)return 1-F/math.max(#self,#l)end;function a.__index:empty()return""end;function a.__index:toCamel()local G=self:array()for j,n in ipairs(G)do G[j]=j%2==0 and n:lower()or n:upper()end;return table.concat(G)end;function a.__index:shuffle(H)math.randomseed(H or os.clock())local G,I=self:array(),{}for j=1,#G do I[j]=G[math.random(#G)]end;return table.concat(I)end end


local sampev = require 'lib.samp.events'

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(0) end
    sampAddChatMessage("{6d9eeb}[BRC] {90EE90}Script is loaded.")
end

function sampev.onShowDialog(id, style, title, button1, button2, text)
    storage = text:split("\n")

    print( table.concat(storage, ', ') )
end

получаю ошибку "Empty separator", что-то не так делаю?
 

imring

Ride the Lightning
Всефорумный модератор
2,353
2,512
код:
Lua:
-->> str lib (https://www.blast.hk/threads/147968/) <<--
do local a=getmetatable("String")function a.__index:insert(b,pos)if pos==nil then return self..b end;return self:sub(1,pos)..b..self:sub(pos+1)end;function a.__index:extract(c)self=self:gsub(c,"")return self end;function a.__index:array()local d={}for e in self:gmatch(".")do d[#d+1]=e end;return d end;function a.__index:isEmpty()return self:find("%S")==nil end;function a.__index:isDigit()return self:find("%D")==nil end;function a.__index:isAlpha()return self:find("[%d%p]")==nil end;function a.__index:split(f,g)assert(not f:isEmpty(),"Empty separator")result,pos={},1;repeat local e,h=self:find(f or" ",pos,g)result[#result+1]=self:sub(pos,e and e-1)pos=h and h+1 until pos==nil;return result end;local i=string.lower;function a.__index:lower()for j=192,223 do self=self:gsub(string.char(j),string.char(j+32))end;self=self:gsub(string.char(168),string.char(184))return i(self)end;local k=string.upper;function a.__index:upper()for j=224,255 do self=self:gsub(string.char(j),string.char(j-32))end;self=self:gsub(string.char(184),string.char(168))return k(self)end;function a.__index:isSpace()return self:find("^[%s%c]+$")~=nil end;function a.__index:isUpper()return self:upper()==self end;function a.__index:isLower()return self:lower()==self end;function a.__index:isSimilar(l)return self==l end;function a.__index:isTitle()local m=self:find("[A-zА-яЁё]")local n=self:sub(m,m)return n:isSimilar(n:upper())end;function a.__index:startsWith(l)return self:sub(1,#l):isSimilar(l)end;function a.__index:endsWith(l)return self:sub(#self-#l+1,#self):isSimilar(l)end;function a.__index:capitalize()local o=self:sub(1,1):upper()self=self:gsub("^.",o)return self end;function a.__index:tabsToSpace(p)local q=(" "):rep(p or 4)self=self:gsub("\t",q)return self end;function a.__index:spaceToTabs(p)local q=(" "):rep(p or 4)self=self:gsub(q,"t")return self end;function a.__index:center(r,s)local t=r-#self;local e=string.rep(s or" ",t)return e:insert(self,math.ceil(t/2))end;function a.__index:count(u,v,w)assert(not u:isEmpty(),"Empty search")local x=self:sub(v or 1,w or#self)local p,pos=0,v or 1;repeat local e,h=x:find(u,pos,true)p=e and p+1 or p;pos=h and h+1 until pos==nil;return p end;function a.__index:trimEnd()self=self:gsub("%s*$","")return self end;function a.__index:trimStart()self=self:gsub("^%s*","")return self end;function a.__index:trim()self=self:match("^%s*(.-)%s*$")return self end;function a.__index:swapCase()local result={}for e in self:gmatch(".")do if e:isAlpha()then e=e:isLower()and e:upper()or e:lower()end;result[#result+1]=e end;return table.concat(result)end;function a.__index:splitEqually(r)assert(r>0,"Width less than zero")assert(r<=self:len(),"Width is greater than the string length")local result,j={},1;repeat if#result==0 or#result[#result]>=r then result[#result+1]=""end;result[#result]=result[#result]..self:sub(j,j)j=j+1 until j>#self;return result end;function a.__index:rFind(c,pos,g)local j=pos or#self;repeat local result={self:find(c,j,g)}if next(result)~=nil then return table.unpack(result)end;j=j-1 until j<=0;return nil end;function a.__index:wrap(r)assert(r>0,"Width less than zero")assert(r<self:len(),"Width is greater than the string length")local pos=1;self=self:gsub("(%s+)()(%S+)()",function(y,z,A,B)if B-pos>(r or 72)then pos=z;return"\n"..A end end)return self end;function a.__index:levDist(l)if#self==0 then return#l elseif#l==0 then return#self elseif self==l then return 0 end;local C=0;local D={}for j=0,#self do D[j]={}D[j][0]=j end;for j=0,#l do D[0][j]=j end;for j=1,#self,1 do for E=1,#l,1 do C=self:byte(j)==l:byte(E)and 0 or 1;D[j][E]=math.min(D[j-1][E]+1,D[j][E-1]+1,D[j-1][E-1]+C)end end;return D[#self][#l]end;function a.__index:getSimilarity(l)local F=self:levDist(l)return 1-F/math.max(#self,#l)end;function a.__index:empty()return""end;function a.__index:toCamel()local G=self:array()for j,n in ipairs(G)do G[j]=j%2==0 and n:lower()or n:upper()end;return table.concat(G)end;function a.__index:shuffle(H)math.randomseed(H or os.clock())local G,I=self:array(),{}for j=1,#G do I[j]=G[math.random(#G)]end;return table.concat(I)end end


local sampev = require 'lib.samp.events'

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(0) end
    sampAddChatMessage("{6d9eeb}[BRC] {90EE90}Script is loaded.")
end

function sampev.onShowDialog(id, style, title, button1, button2, text)
    storage = text:split("\n")

    print( table.concat(storage, ', ') )
end

получаю ошибку "Empty separator", что-то не так делаю?
в библиотеке зачем-то для разделителя вызывается метод isEmpty
string.isEmpty(str) — Проверяет, пустая ли строка или состоит только из пробелов
Lua:
function mt.__index:isEmpty()
    return self:find("%S") == nil
end


function mt.__index:split(sep, plain)
    assert(not sep:isEmpty(), "Empty separator")  
    result, pos = {}, 1
    repeat
        local s, f = self:find(sep or " ", pos, plain)
        result[#result + 1] = self:sub(pos, s and s - 1)
        pos = f and f + 1
    until pos == nil
    return result
end
из-за этого пробельные разделители не работают

upd: можешь воспользоваться [\n] вместо \n, чтобы isEmpty возвращала true (выглядит как костыль)
1694555853689.png
 
Последнее редактирование:
  • Нравится
Реакции: painw, Jora2412 и Z3roKwq

meowprd

Тот самый Котовский
Проверенный
1,283
711
string.unplain(str) — Экранирует regex-символы в строке (new)
метод из либы:
Lua:
function mt.__index:unplain()
    local arr = self:array()
    for i, let in ipairs(arr) do
        if let:find("().%+-*?[]^$", 1, true) then
            arr[i] = "%" .. let
        end
    end
    return table.concat(arr)
end

метод, которым я всегда пользовался:
Lua:
local text = '([%^$().[]*+-?)'
print(text:gsub("([^%w])", "%%%1"))
-- output: %(%[%%%^%$%(%)%.%[%]%*%+%-%?%)    15

local text = "().%+-*?[]^$"
print(text:gsub("([^%w])", "%%%1"))
-- output: %(%)%.%%%+%-%*%?%[%]%^%$    12

не знаю, подойдет ли он в реалиях библиотеки, но решил оставить его тут.
 
  • Нравится
Реакции: Cosmo