我在Lua中有一个字符串,想要在其中迭代单个字符.但是没有我尝试过的代码和官方手册只显示如何查找和替换子串:(
str = "abcd" for char in str do -- error print( char ) end for i = 1, str:len() do print( str[ i ] ) -- nil end
RBerteig.. 120
在lua 5.1中,您可以通过几种方式迭代字符串的字符.
基本循环是:
for i = 1, #str do local c = str:sub(i,i) -- do something with c end
但是使用模式string.gmatch()
来获取字符上的迭代器可能更有效:
for c in str:gmatch"." do -- do something with c end
甚至用来string.gsub()
为每个char调用一个函数:
str:gsub(".", function(c) -- do something with c end)
在上面的所有内容中,我利用了将string
模块设置为所有字符串值的元表的事实,因此可以使用:
表示法将其函数称为成员.我也使用(新的5.1,IIRC)#
来获取字符串长度.
您的应用程序的最佳答案取决于很多因素,如果性能变得重要,基准测试就是您的朋友.
您可能想要评估为什么需要迭代字符,并查看已绑定到Lua的正则表达式模块之一,或者查看Roberto的lpeg模块,该模块实现了Lua的Parsing Expression Grammers.
在lua 5.1中,您可以通过几种方式迭代字符串的字符.
基本循环是:
for i = 1, #str do local c = str:sub(i,i) -- do something with c end
但是使用模式string.gmatch()
来获取字符上的迭代器可能更有效:
for c in str:gmatch"." do -- do something with c end
甚至用来string.gsub()
为每个char调用一个函数:
str:gsub(".", function(c) -- do something with c end)
在上面的所有内容中,我利用了将string
模块设置为所有字符串值的元表的事实,因此可以使用:
表示法将其函数称为成员.我也使用(新的5.1,IIRC)#
来获取字符串长度.
您的应用程序的最佳答案取决于很多因素,如果性能变得重要,基准测试就是您的朋友.
您可能想要评估为什么需要迭代字符,并查看已绑定到Lua的正则表达式模块之一,或者查看Roberto的lpeg模块,该模块实现了Lua的Parsing Expression Grammers.
如果您使用的是Lua 5,请尝试:
for i = 1, string.len(str) do print( string.sub(str, i, i) ) end
根据手头的任务,它可能更容易使用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