如何在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