我想将字符串文本转换为表格,此文本必须按字符划分。每个字符必须在表的单独值中,例如:
答案 0 :(得分:10)
您可以使用string.gsub函数
t={}
str="text"
str:gsub(".",function(c) table.insert(t,c) end)
答案 1 :(得分:8)
只需将每个符号编入索引并将其放在表格中的相同位置。
local str = "text"
local t = {}
for i = 1, #str do
t[i] = str:sub(i, i)
end
答案 2 :(得分:3)
内置的字符串库将Lua字符串视为字节数组。 适用于多字节(Unicode)字符的替代方案是 unicode library那个 起源于Selene项目。 它的主要卖点是它可以作为替代品使用 对于字符串库,使大多数字符串操作“神奇地” Unicode的。
如果您不想添加第三方依赖项,则可以轻松完成任务 使用LPeg实施。 这是一个示例分割器:
local lpeg = require "lpeg"
local C, Ct, R = lpeg.C, lpeg.Ct, lpeg.R
local lpegmatch = lpeg.match
local split_utf8 do
local utf8_x = R"\128\191"
local utf8_1 = R"\000\127"
local utf8_2 = R"\194\223" * utf8_x
local utf8_3 = R"\224\239" * utf8_x * utf8_x
local utf8_4 = R"\240\244" * utf8_x * utf8_x * utf8_x
local utf8 = utf8_1 + utf8_2 + utf8_3 + utf8_4
local split = Ct (C (utf8)^0) * -1
split_utf8 = function (str)
str = str and tostring (str)
if not str then return end
return lpegmatch (split, str)
end
end
此代码段定义了创建表格的函数split_utf8()
UTF8字符(如Lua字符串),但如果是字符串则返回nil
不是有效的UTF序列。
您可以运行此测试代码:
tests = {
en = [[Lua (/ˈluːə/ LOO-ə, from Portuguese: lua [ˈlu.(w)ɐ] meaning moon; ]]
.. [[explicitly not "LUA"[1]) is a lightweight multi-paradigm programming ]]
.. [[language designed as a scripting language with "extensible ]]
.. [[semantics" as a primary goal.]],
ru = [[Lua ([лу́а], порт. «луна») — интерпретируемый язык программирования, ]]
.. [[разработанный подразделением Tecgraf Католического университета ]]
.. [[Рио-де-Жанейро.]],
gr = [[Η Lua είναι μια ελαφρή προστακτική γλώσσα προγραμματισμού, που ]]
.. [[σχεδιάστηκε σαν γλώσσα σεναρίων με κύριο σκοπό τη δυνατότητα ]]
.. [[επέκτασης της σημασιολογίας της.]],
XX = ">\255< invalid"
}
-------------------------------------------------------------------------------
local limit = 14
for lang, str in next, tests do
io.write "\n"
io.write (string.format ("<%s %3d> ->", lang, #str))
local chars = split_utf8 (str)
if not chars then
io.write " INVALID!"
else
io.write (string.format (" <%3d>", #chars))
for i = 1, #chars > limit and limit or #chars do
io.write (string.format (" %q", chars [i]))
end
end
end
io.write "\n"
顺便说一句,用LPeg构建一个表比调用快得多
table.insert()
一再发生。
以下是分割整个果戈理的 Dead Souls 的统计数据
俄语,1023814字节原始,571395字符UTF)在我的机器上:
library method time in ms
string table.insert() 380
string t [#t + 1] = c 310
string gmatch & for loop 280
slnunicode table.insert() 220
slnunicode t [#t + 1] = c 200
slnunicode gmatch & for loop 170
lpeg Ct (C (...)) 70
答案 3 :(得分:0)
您可以通过以下代码轻松实现此目标。
> t = {} >str = "text" > for i=1, string.len(str) do t[i]= (string.sub(str,i,i)) end > for k , v in pairs(t) do print(k,v) end 1 t 2 e 3 x 4 t >
string.sub
string.sub(s, i [, j])
返回传递的字符串的子字符串。子串从i开始。如果没有给出第三个参数j,子字符串将在字符串的末尾结束。如果给出第三个参数,则子串结束于并包含j。