を、 。あなたはいくつかの方法で文字列の文字で、これを繰り返すことができ
を基本ループは次のようになります。
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のための表現式グラマー。
感謝。あなたが言及したlpegモジュールについて - それはトークン化の後に元のテキストのトークン位置を保存しますか?私が実行する必要があるタスクは、lua(コンパイル済みのC++パーサーなし)を介して特定のシンプルな言語をsciteで強調表示することです。また、lpegのインストール方法は? .cソースが配布されているようです - luaと一緒にコンパイルする必要がありますか? – grigoryvp
lpegをビルドすると、requireが見つかる場所に格納する必要があるDLL(または.so)が生成されます。 (つまり、あなたのluaインストールのグローバルなpackage.cpathの内容で識別されるどこかの場所)。簡略化された構文を使用するには、コンパニオンモジュールre.luaもインストールする必要があります。 lpeg文法から、コールバックを取得してテキストをさまざまな方法で取得することができます。また、キャプチャを使用して後で使用するための一致の場所を保存することも可能です。シンタックスハイライトが目標である場合、PEGはツールの悪い選択ではありません。 – RBerteig
[SciTEの最新リリース](http://www.scintilla。org/SciTEDownload.html)(2.22以降)には、LPEGベースのレクサーであるScintilluaが含まれています。これは、すぐに動作し、再コンパイルする必要はありません。 –