如何在Luastring中迭代单个字符?

我在Lua中有一个string,并且想要迭代它中的单个字符。 但没有代码我已经尝试的作品和官方手册只显示如何查找和replace子string:(

str = "abcd" for char in str do -- error print( char ) end for i = 1, str:len() do print( str[ i ] ) -- nil end 

在lua 5.1中,你可以通过几种方法迭代string的字符。

基本的循环是:

对于i = 1,#str做
    本地c = str:sub(i,i)
     - 用c做一些事情
结束

但是使用string.gmatch()的模式来获取字符的迭代器可能更有效率:

 for c in str:gmatch“。” 做
     - 用c做一些事情
结束

甚至可以使用string.gsub()为每个char调用一个函数:

 str:gsub(“。”,function(c)
     - 用c做一些事情
结束)

在以上所有中,我已经利用了将string模块设置为所有string值的元数据的事实,因此可以使用:符号将其函数作为成员调用。 我也使用了(新到5.1,IIRC) #来获得string的长度。

你的应用程序的最佳答案取决于很多因素,基准是你的朋友,如果性能是重要的。

您可能想要评估为什么需要迭代字符,并查看已绑定到Lua的正则expression式模块之一,或者使用现代方法查看实现用于Lua的parsingexpression式语法的Roberto的lpeg模块。

如果您使用的是Lua 5,请尝试:

 for i = 1, string.len(str) do print( string.sub(str, i, i) ) end 

根据手头的任务,使用string.byte可能更容易。 这也是最快的方法,因为它避免了创build新的子string,在Lua中变得相当昂贵,这要归功于每个新string的散列并检查它是否已知。 您可以使用相同的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 

所有人都提出一个不太理想的方法

将是最好的:

  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]) -- prints the char 'e' print("-------------------\n") for i = 1, #str do -- testing printing all the chars if (char[i] == " ") then print("Char "..i..": [[space]]") else print("Char "..i..": "..char[i]) end end