Lua に文字列があり、その中の個々の文字を繰り返し処理したいと考えています。しかし、私が試したコードは機能せず、公式マニュアルは部分文字列を見つけて置き換える方法のみを示しています:(
str = "abcd"
for char in str do -- error
print( char )
end
for i = 1, str:len() do
print( str[ i ] ) -- nil
end
Lua に文字列があり、その中の個々の文字を繰り返し処理したいと考えています。しかし、私が試したコードは機能せず、公式マニュアルは部分文字列を見つけて置き換える方法のみを示しています:(
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では、いくつかの方法で文字列の文字を繰り返すことができます。
基本的なループは次のようになります。
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()
、各文字の関数を呼び出すために使用することもできます。
str:gsub(".", function(c)
-- do something with c
end)
上記のすべてで、string
モジュールがすべての文字列値のメタテーブルとして設定されているという事実を利用しているため、その関数は:
表記を使用してメンバーとして呼び出すことができます。#
また、文字列の長さを取得するために(5.1の新機能であるIIRC)を使用しました。
アプリケーションの最良の答えは多くの要因に依存し、パフォーマンスが重要になる場合はベンチマークが友だちです。
文字を反復処理する必要がある理由を評価し、Luaにバインドされている正規表現モジュールの1つを確認するか、最新のアプローチとして、LuaのParsingExpressionGrammersを実装するRobertoのlpegモジュールを確認することをお勧めします。
手元のタスクによっては、使いやすい場合があります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
Lua 5を使用している場合は、次を試してください。
for i = 1, string.len(str) do
print( string.sub(str, i, i) )
end
文字列を構築するために反復し、この文字列を 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
すべての人が最適ではない方法を提案する
最高になります:
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