102

Lua に文字列があり、その中の個々の文字を繰り返し処理したいと考えています。しかし、私が試したコードは機能せず、公式マニュアルは部分文字列を見つけて置き換える方法のみを示しています:(

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

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

6 に答える 6

143

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モジュールを確認することをお勧めします。

于 2009-05-07T00:31:47.363 に答える
13

手元のタスクによっては、使いやすい場合があります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-24T10:30:05.740 に答える
11

Lua 5を使用している場合は、次を試してください。

for i = 1, string.len(str) do
    print( string.sub(str, i, i) )
end
于 2009-05-06T13:05:41.117 に答える
0

文字列を構築するために反復し、この文字列を 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-26T20:04:45.380 に答える
-1

すべての人が最適ではない方法を提案する

最高になります:

    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
于 2017-02-22T09:53:42.210 に答える