2

たとえば、次の形式の任意の行があります。

ディレクトリ C:\Program Files\abc\def\

またはそのようなもの。

ログ対応オン

その最初の行から「C:\Program Files\ab\def\」の部分を抽出できるようにしたい。同様に、2行目の「On」を抽出したいと思います。変数とその値の間のスペースは任意です。変数の名前はわかりますが、それに基づいて値を抽出する必要があります。

したがって、基本的には、最初の単語と、最初の単語に続くいくつかの任意のスペースを削除し、行末まで残っているものを返したいと考えています。

4

3 に答える 3

4

「単語」が「スペースのない文字列」を意味すると仮定すると、次のことができます。

for line in ioFile:lines() do
  local variable, value = line:match("(%S+)%s+(.+)")
  ... --Do stuff with variable and value
end
于 2012-08-21T19:46:11.543 に答える
0

string.matchNicol Bolas によって の代替案が示されました。別の代替案を次に示します。

function splitOnFirstSpace(input)
    local space = input:find(' ') or (#input + 1)
    return input:sub(1, space-1), input:sub(space+1)
end

使用法:

local command, param = splitOnFirstSpace(line)

引数が指定されていない場合 ( splitOnFirstSpace('no-param-here'))、paramは空の文字列です。

于 2012-08-22T09:32:30.063 に答える
-1

Ruby や Perl のように、Lua に split() 関数がパッケージ化されているとは思えません。

この男が Perl の分割関数の lua バージョンを作成したことがわかりました: http://lua-users.org/lists/lua-l/2011-02/msg01145.html

引数の前に 1 単語しかなく、その単語にスペースが含まれていないことを保証できる場合は、その行を読み取り、分割関数を実行し、戻り配列の 1 インデックス値を必要なものとして使用できます。

それもエラーチェックして、予想されるディレクトリ内に「C:\」があることを確認するか、文字列が == から「オン」または「オフ」になっていることを確認してください。ハードコーディングされたインデックス値を使用しているため、期待値のエラー チェックを行うことをお勧めします。想定された値が間違っていることほど悪いことはありません。

エラーが検出された場合は、必ずログに記録するか画面に出力して、それについて知るようにしてください。

これにより、入力された文字列が不適切である可能性があるバグがキャッチされる可能性があります。

私があなたに提案することをモデル化するいくつかの簡単なコード:

line = "directory C:\Program Files\abc\def/";

contents = line.split(" "); --Split using a space
directory = contents[2]; --Here is your directory

if(errorCheckDir(directory))
--Use directory
end

編集: 以下のコメントに応答して、Lua は実際に 0 ではなく 1 でインデックス作成を開始します。また、単にコンテンツ [2] を使用する代わりに、ディレクトリにスペースが含まれている場合 (これはおそらくそうです)、インデックスを除くすべてのコンテンツをループします。 1、ディレクトリを元に戻して、添付する各インデックス間に必要なスペースを追加してください。

したがって、上記の場合、コンテンツ [2] とコンテンツ [3] は、適切なディレクトリを回復するために間にスペースを入れてつなぎ合わせる必要があります。

ディレクトリ = 内容[2].." "..内容[3]

これは、ループを含む関数を使用して簡単に自動化でき、適切なディレクトリを返します。

function recoverDir(contents)
    directory = "";
    --Recover the directory
    for i=2, table.getn(contents) do
        directory = directory..contents[i].." ";
    end
    --strip extra space on the end
    dirEnd = string.len(directory);
    directory = string.sub(directory,1,dirEnd-1);
    return directory; --proper directory
end
于 2012-08-21T19:57:31.770 に答える