1

数字で始まり、次にスペース、次に未知の文字数の単語、再びスペース、そして時には別のテキスト(複数の単語を含む場合と含まない場合があります)の文字列があります。

編集: テキストの最後の部分が省略されることがあります (例 #2 を参照)。コメントに記載されているメソッドを使用すると、#2 の str:find(...) は nil を返します。

例:

"(number) (text) [more text]"
1: "10 HELLO This is a string"
2: "88 BYE"

私が望むのは、次のように、これらの文字列をテーブルに分割し、これらの分割文字列をさらに含むテーブル内に分割することです。

{
  [(number)] = { [1] = (text), [2] = (more text) }
  [10] = { [1] = "HELLO", [2] = "This is a string" }
}

いくつかの方法を試しましたが、どれも望ましい結果をもたらしません。たとえば、私が試した方法の 1 つは、文字列を空白で分割することでした。しかし、それは次の結果になりました:

{
  [10] = { [1] = "HELLO", [2] = "This", ... [4] = "string" }
}

前もって感謝します。

4

2 に答える 2

2

さまざまな Lua文字列パターンを使用して、目的の結果を達成するのは非常に簡単です。

たとえば。

function CustomMatching( sVar )
    local tReturn = {}
    local _, _, iNumber, sWord, sRemain = sVar:find( "^(%d+)%s(%a+)%s(.+)" )
    tReturn[tonumber(iNumber)] = { sWord, sRemain }
    return tReturn
end

そしてそれを呼び出すには:

local sVar = "10 HELLO This is a string"
local tMyTable = CustomMatching( sVar )

find()メソッドでは、パターンは次の"^(%d+)%s(%a+)%s(.+)"ことを意味します。

  • %dスペースが検出されるまで、すべての数字 ( ) を検索して保存します。
  • %aスペースが検出されるまで、すべての文字 ( ) を検索して保存します。
  • 文字列の末尾に到達するまで、すべての文字を検索して保存します。

編集

コメントの議論に従ってに変更tReturn[iNumber]されました。tReturn[tonumber(iNumber)]

于 2013-03-19T21:06:41.597 に答える
0

適切なパターンstring.matchでメソッドを使用できます。

local n, w, str = ('10 HELLO This is a string'):match'^(%d+)%s+(%S+)%s+(.*)$'
your_table[tonumber(n)] = {w, str}
于 2013-03-19T19:31:01.420 に答える