VCIのメッセージ機能やコメントの受信が可能になった事により、stringの検索が必要になる事があります。
ここでは下記方法でstring型を検索する方法について解説します。
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()の詳細は Lua 5.2 リファレンスマニュアル - string.find() を参考にしてください。
決まった文字列ではなく、特定の条件を満たす文字列を検索したい時などあると思います。
その場合、Luaのパターンを使って文字列の検索等を行います。
match()関数については Lua 5.2 リファレンスマニュアル - string.match() を参考にしてください。
Luaのパターンについては 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
を返します。
数字や+記号以外にも様々な表現方法があるので Lua 5.2 リファレンスマニュアル - 6.4.1 パターン を参考にしてください。