1. ホーム
  2. string

[解決済み] Luaでstring.gmatch()を使って文字列を分割する

2022-03-12 13:11:59

質問

文字列を分割するためのいくつかの議論やユーティリティ関数がありますが、私は非常に単純なタスクのためのアドホックなワンライナーが必要です。

次のような文字列があります。

local s = "one;two;;four"

で分割したい。 ";" . 私は、最終的に { "one", "two", "", "four" } を返します。

というわけで、やってみました。

local s = "one;two;;four"

local words = {}
for w in s:gmatch("([^;]*)") do table.insert(words, w) end

しかし、その結果( words テーブル)は { "one", "", "two", "", "", "four", "" } . それは確かに私が欲しいものではありません。

さて、私が発言したように、ここには文字列の分割に関する議論がいくつかありますが、それらには "長い" 関数があり、私は何か簡潔なものが必要なのです。このコードはLuaの長所を示すプログラムのために必要で、もしつまらないことをするために長い関数を追加したら、私の逆鱗に触れてしまうでしょう。

どのように解決するのですか?

local s = "one;two;;four"
local words = {}
for w in (s .. ";"):gmatch("([^;]*);") do 
    table.insert(words, w) 
end

を1つ追加することで ; を文字列の末尾に追加すると、文字列は次のようになります。 "one;two;;four;" を使えば、キャプチャしたいもの全てにパターン "([^;]*);" にマッチします。 ; の後に ; (欲張り)です。

テストしてください。

for n, w in ipairs(words) do
    print(n .. ": " .. w)
end

出力します。

1: one
2: two
3:
4: four