Lua - 将字符串转换为表格

时间:2013-12-06 12:02:15

标签: string lua lua-table

我想将字符串文本转换为表格,此文本必须按字符划分。每个字符必须在表的单独值中,例如:

  • 一个= “文本”
  • - 将字符串(a)转换为表格(b)
  • - 显示表格(b)
  • B = { 'T', 'E', 'X', 'T'}

4 个答案:

答案 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。