2009-05-06 11 views
67

私はLuaに文字列を持ち、個々の文字を繰り返したいと思っています。あなたはLuaの5を使用している場合しかし、私は作品を試みたいかなるコードおよび公式マニュアルのみのサブストリングを検索と置換する方法を示しています:(ルア文字列の個々の文字を反復する方法は?

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

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

答えて

101

を、 。あなたはいくつかの方法で文字列の文字で、これを繰り返すことができ

を基本ループは次のようになります。

 
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モジュールがすべての文字列値のメタテーブルとして設定されているので、その関数を:という表記法を使用してメンバーとして呼び出すことができます。また、文字列の長さを取得するために、(new to 5.1、IIRC)#を使用しました。

アプリケーションに最適な答えは、多くの要因によって異なります。パフォーマンスが問題になる場合はベンチマークがあなたの友人です。

あなたは文字を反復すると、Luaのにバインドされている正規表現モジュールの一つを見てする必要がある理由を評価する場合があります、または現代的なアプローチのための解析を実装ロベルトのlpegモジュールに見えますLuaのための表現式グラマー。

+0

感謝。あなたが言及したlpegモジュールについて - それはトークン化の後に元のテキストのトークン位置を保存しますか?私が実行する必要があるタスクは、lua(コンパイル済みのC++パーサーなし)を介して特定のシンプルな言語をsciteで強調表示することです。また、lpegのインストール方法は? .cソースが配布されているようです - luaと一緒にコンパイルする必要がありますか? – grigoryvp

+0

lpegをビルドすると、requireが見つかる場所に格納する必要があるDLL(または.so)が生成されます。 (つまり、あなたのluaインストールのグローバルなpackage.cpathの内容で識別されるどこかの場所)。簡略化された構文を使用するには、コンパニオンモジュールre.luaもインストールする必要があります。 lpeg文法から、コールバックを取得してテキストをさまざまな方法で取得することができます。また、キャプチャを使用して後で使用するための一致の場所を保存することも可能です。シンタックスハイライトが目標である場合、PEGはツールの悪い選択ではありません。 – RBerteig

+2

[SciTEの最新リリース](http://www.scintilla。org/SciTEDownload.html)(2.22以降)には、LPEGベースのレクサーであるScintilluaが含まれています。これは、すぐに動作し、再コンパイルする必要はありません。 –

10

、してみてくださいません:LUA 5.1で

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

手近な作業によっては、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 
-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 
+0

どのタスクが「最適化されていませんか?どのような仕事のための "ベスト"? –

関連する問題