如何在 Lua 字符串中迭代单个字符?

我在 Lua 中有一个字符串,想要迭代其中的单个字符。但是我尝试过的所有代码都不起作用,官方手册只显示如何查找和替换子字符串:(

str = "abcd"
for char in str do -- 出错
  print( char )
end

for i = 1, str:len() do
  print( str[ i ] ) -- nil
end

原文链接 https://stackoverflow.com/questions/829063

点赞
stackoverflow用户48940
stackoverflow用户48940

如果您正在使用 Lua 5,请尝试:

for i = 1, string.len(str) do
    print( string.sub(str, i, i) )
end
2009-05-06 13:05:41
stackoverflow用户68204
stackoverflow用户68204

在lua 5.1中,你可以使用几种方法来迭代一个字符串的字符。

最基本的循环为:

for i = 1, #str do
    local c = str:sub(i,i)
    -- 对c进行处理
end

但是,使用string.gmatch()与模式匹配来获取一个字符的迭代器可能更加高效:

for c in str:gmatch"." do
    -- 对c进行处理
end

甚至可以使用string.gsub()调用一个函数来处理每个字符:

str:gsub(".", function(c)
    -- 对c进行处理
end)

在上述所有例子中,我利用了string模块是所有字符串值的元表这一事实,因此它的函数可以使用:符号作为成员来调用。我还使用了(我记得新到5.1的)#来获取字符串的长度。

对于你的应用程序来说,最佳答案取决于很多因素,如果性能很重要的话,请使用基准测试。

你可能会想评估一下你需要迭代字符的原因,并查看已绑定到Lua的正则表达式模块之一,或者采取现代方法,了解Roberto的lpeg模块,它实现了用于Lua的解析表达式语法。

2009-05-07 00:31:47
stackoverflow用户936986
stackoverflow用户936986

根据任务的需要,使用string.byte可能更容易。这也是最快的方法,因为它避免了创建新的子串,这在 Lua 中非常昂贵,因为它需要对每个新字符串进行哈希处理,并检查它是否已知。您可以预先计算使用相同string.byte查找的符号的代码,以保持可读性和可移植性。

local str = "ab/cd/ef"
local target = string.byte("/")
for idx = 1, #str do
   if str:byte(idx) == target then
      print("Target found at:", idx)
   end
end
2015-12-24 10:30:05
stackoverflow用户7603987
stackoverflow用户7603987

所有人都建议使用不太优化的方法

将会是最好的:

    function chars(str)
        strc = {}
        for i = 1, #str do
            table.insert(strc, string.sub(str, i, i))
        end
        return strc
    end

    str = "Hello world!"
    char = chars(str)
    print("Char 2: "..char[2]) -- 打印字符'e'
    print("-------------------\n")
    for i = 1, #str do -- 测试打印所有字符
        if (char[i] == " ") then
            print("Char "..i..": [[space]]")
        else
            print("Char "..i..": "..char[i])
        end
    end
2017-02-22 09:53:42
stackoverflow用户11740758
stackoverflow用户11740758

迭代构建字符串,将该字符串作为表并使用load()返回...

itab=function(char)
local result
for i=1,#char do
 if i==1 then
  result=string.format('%s','{')
 end
result=result..string.format('\'%s\'',char:sub(i,i))
 if i~=#char then
  result=result..string.format('%s',',')
 end
 if i==#char then
  result=result..string.format('%s','}')
 end
end
 return load('return '..result)()
end

dump=function(dump)
for key,value in pairs(dump) do
 io.write(string.format("%s=%s=%s\n",key,type(value),value))
end
end

res=itab('KOYAANISQATSI')

dump(res)

输出...

1=string=K
2=string=O
3=string=Y
4=string=A
5=string=A
6=string=N
7=string=I
8=string=S
9=string=Q
10=string=A
11=string=T
12=string=S
13=string=I
2020-10-26 20:04:45