Замена каждого символа в элементе массива
Задача - обработать слова в элементе в формат [аА][бБ][вВ]
Пробовал такой код
local russian_characters = {
[168] = 'Ё', [184] = 'ё', [192] = 'А', [193] = 'Б', [194] = 'В', [195] = 'Г', [196] = 'Д', [197] = 'Е', [198] = 'Ж', [199] = 'З', [200] = 'И', [201] = 'Й', [202] = 'К', [203] = 'Л', [204] = 'М', [205] = 'Н', [206] = 'О', [207] = 'П', [208] = 'Р', [209] = 'С', [210] = 'Т', [211] = 'У', [212] = 'Ф', [213] = 'Х', [214] = 'Ц', [215] = 'Ч', [216] = 'Ш', [217] = 'Щ', [218] = 'Ъ', [219] = 'Ы', [220] = 'Ь', [221] = 'Э', [222] = 'Ю', [223] = 'Я', [224] = 'а', [225] = 'б', [226] = 'в', [227] = 'г', [228] = 'д', [229] = 'е', [230] = 'ж', [231] = 'з', [232] = 'и', [233] = 'й', [234] = 'к', [235] = 'л', [236] = 'м', [237] = 'н', [238] = 'о', [239] = 'п', [240] = 'р', [241] = 'с', [242] = 'т', [243] = 'у', [244] = 'ф', [245] = 'х', [246] = 'ц', [247] = 'ч', [248] = 'ш', [249] = 'щ', [250] = 'ъ', [251] = 'ы', [252] = 'ь', [253] = 'э', [254] = 'ю', [255] = 'я',
}
function string.rlower(s)
s = s:lower()
local strlen = s:len()
if strlen == 0 then return s end
s = s:lower()
local output = ''
for i = 1, strlen do
local ch = s:byte(i)
if ch >= 192 and ch <= 223 then
output = output .. russian_characters[ch + 32]
elseif ch == 168 then
output = output .. russian_characters[184]
else
output = output .. string.char(ch)
end
end
return output
end
function string.rupper(s)
s = s:upper()
local strlen = s:len()
if strlen == 0 then return s end
s = s:upper()
local output = ''
for i = 1, strlen do
local ch = s:byte(i)
if ch >= 224 and ch <= 255 then
output = output .. russian_characters[ch - 32]
elseif ch == 184 then
output = output .. russian_characters[168]
else
output = output .. string.char(ch)
end
end
return output
end
tbl = {['test'] = {'слово один', 'слово два', 'слово три', 'слово четыре', 'слово пять'}}
arr = {}
for k, v in pairs(tbl.test) do
v:gsub(".", function(c) table.insert(arr, '['..string.rlower(c)..''..string.rupper(c)..']') end)
end
print(unpack(arr))
print(table.concat(arr, ""))
возвращает всё в одной строке.
А мне необходимо чтобы каждый элемент возвращался в новой строке.
[сС][лЛ][оО][вВ][оО] [оО][дД][иИ][нН]
[сС][лЛ][оО][вВ][оО] [дД][вВ][аА]
Ответы (1 шт):
Автор решения: dmitriyewich
→ Ссылка
Нашел решение с помощью функции https://stackoverflow.com/a/10231245
итого получилось:
local russian_characters = {
[168] = 'Ё', [184] = 'ё', [192] = 'А', [193] = 'Б', [194] = 'В', [195] = 'Г', [196] = 'Д', [197] = 'Е', [198] = 'Ж', [199] = 'З', [200] = 'И', [201] = 'Й', [202] = 'К', [203] = 'Л', [204] = 'М', [205] = 'Н', [206] = 'О', [207] = 'П', [208] = 'Р', [209] = 'С', [210] = 'Т', [211] = 'У', [212] = 'Ф', [213] = 'Х', [214] = 'Ц', [215] = 'Ч', [216] = 'Ш', [217] = 'Щ', [218] = 'Ъ', [219] = 'Ы', [220] = 'Ь', [221] = 'Э', [222] = 'Ю', [223] = 'Я', [224] = 'а', [225] = 'б', [226] = 'в', [227] = 'г', [228] = 'д', [229] = 'е', [230] = 'ж', [231] = 'з', [232] = 'и', [233] = 'й', [234] = 'к', [235] = 'л', [236] = 'м', [237] = 'н', [238] = 'о', [239] = 'п', [240] = 'р', [241] = 'с', [242] = 'т', [243] = 'у', [244] = 'ф', [245] = 'х', [246] = 'ц', [247] = 'ч', [248] = 'ш', [249] = 'щ', [250] = 'ъ', [251] = 'ы', [252] = 'ь', [253] = 'э', [254] = 'ю', [255] = 'я',
}
function string.rlower(s)
s = s:lower()
local strlen = s:len()
if strlen == 0 then return s end
s = s:lower()
local output = ''
for i = 1, strlen do
local ch = s:byte(i)
if ch >= 192 and ch <= 223 then
output = output .. russian_characters[ch + 32]
elseif ch == 168 then
output = output .. russian_characters[184]
else
output = output .. string.char(ch)
end
end
return output
end
function string.rupper(s)
s = s:upper()
local strlen = s:len()
if strlen == 0 then return s end
s = s:upper()
local output = ''
for i = 1, strlen do
local ch = s:byte(i)
if ch >= 224 and ch <= 255 then
output = output .. russian_characters[ch - 32]
elseif ch == 184 then
output = output .. russian_characters[168]
else
output = output .. string.char(ch)
end
end
return output
end
tbl = {['test'] = {'слово один', 'слово два', 'слово три', 'слово четыре', 'слово пять'}}
function nocase (s)
s = string.gsub(s, ".", function (c)
return string.format("[%s%s]", string.rlower(c),
string.rupper(c))
end)
return s
end
for k, v in pairs(tbl.test) do
print(nocase(v))
end
Возвращает в нужном формате
[сС][лЛ][оО][вВ][оО][ ][оО][дД][иИ][нН]
[сС][лЛ][оО][вВ][оО][ ][дД][вВ][аА]
[сС][лЛ][оО][вВ][оО][ ][тТ][рР][иИ]
[сС][лЛ][оО][вВ][оО][ ][чЧ][еЕ][тТ][ыЫ][рР][еЕ]
[сС][лЛ][оО][вВ][оО][ ][пП][яЯ][тТ][ьЬ]
Осталось решить проблему с пробелом, чтобы не возвращало [ ]