====== 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 パターン を参考にしてください。