====== string型の検索方法まとめ ====== VCIのメッセージ機能やコメントの受信が可能になった事により、stringの検索が必要になる事があります。\\ ここでは下記方法でstring型を検索する方法について解説します。 * 部分一致検索 * 特定の条件を満たす文字列 ===== find()関数で部分一致検索を行う ===== function onMessage(sender, name, message) --コメント内容 print(sender["name"].."「"..message.."」") --「草」を含むコメントであれば true local kusa = false if string.find(message,"草") ~= nil then kusa = true end if kusa == true then print("草を含むコメントがされました") end end -- コメントの受信 vci.message.On('comment', onMessage) 実行結果 草を含むコメントがされました (草を部分一致で検索します) シンプルな方法としては ''string.find()'' を使用して message の中を検索する方法です。\\ \\ 検索したい文字が見つからない場合はnilとなり、一致すれば一致した箇所が何番目にあるかの値を返します。\\ つまり、find()で検索してnilにならなければ、検索した文字が含まれている事になります。\\ find()の詳細は [[vci/script/luareference|Lua 5.2 リファレンスマニュアル]] - string.find() を参考にしてください。 ===== match()関数でパターン一致で検索する ===== 決まった文字列ではなく、特定の条件を満たす文字列を検索したい時などあると思います。\\ その場合、Luaのパターンを使って文字列の検索等を行います。 match()関数については [[vci/script/luareference|Lua 5.2 リファレンスマニュアル]] - string.match() を参考にしてください。\\ Luaのパターンについては [[vci/script/luareference|Lua 5.2 リファレンスマニュアル]] - 6.4.1 パターン を参考にしてください。 **コメントに含まれた数値を調べる** サンプル message = "abc123df432" -- 1 とマッチする箇所を one に代入 one = string.match(message, "1") print(one) -- 5 とマッチする箇所を five に代入 five = string.match(message, "5") print(five) -- %d(数字1桁)とマッチする箇所を number に代入 number = string.match(message, "%d") print(number) -- %d+(数字の連番)とマッチする箇所を number に代入 number = string.match(message, "%d+") print(number) 実行結果 1 nil 1 123 ''string.match()'' では、指定した文字列からパターンに一致する箇所を返します。\\ サンプルでは最初に ''message'' から ''1'' というパターンに合った箇所を検索し ''1'' を返しています。\\ 次に ''5'' というパターンで検索しますが、存在しないので ''nil'' になります。 Luaのパターンで ''%d'' は**全ての数字**を意味します。\\ なので ''%d'' (数字1桁)のパターンに合った箇所を検索し、最初に一致する ''1'' を返しています。\\ ''%d+'' とした場合、**数値が繰り返されている最長の箇所**を意味します。\\ なので、最も数値が連続している箇所の ''123'' を返します。 数字や+記号以外にも様々な表現方法があるので [[vci/script/luareference|Lua 5.2 リファレンスマニュアル]] - 6.4.1 パターン を参考にしてください。