» Strings.lua
Приветствую, хочу представить вам свою первую библиотеку. Её задача - это расширение стандартного набора функций для работы со строковыми типами данных, так как в Lua на этот счёт всё довольно скучненько ( string.sub/gsub/gmatch/find/и т.д ), и лично мне порой часто не хватало тех или иных возможностей, которыми могут похвастаться другие языки программирования. Давайте перейдём ближе к делу..
Для начала работы с библиотекой вам понадобится лишь подключить её в начале своего скрипта:
Готово, библиотека подключена и новые функции для строк уже готовы для работы.
Работать с новыми функциями вы можете в двух способах:
1) Через string ( Например:
2) Используя метод ( Например:
Полный список функций:
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)
Вот несколько примеров, как и что можно сделать используя эти функции:
GitHub: https://github.com/c0sui/lua_strings
Приветствую, хочу представить вам свою первую библиотеку. Её задача - это расширение стандартного набора функций для работы со строковыми типами данных, так как в 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
Вложения
Последнее редактирование: