目次

string型の検索方法まとめ

VCIのメッセージ機能やコメントの受信が可能になった事により、stringの検索が必要になる事があります。
ここでは下記方法でstring型を検索する方法について解説します。

find()関数で部分一致検索を行う

main.lua
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() を参考にしてください。

match()関数でパターン一致で検索する

決まった文字列ではなく、特定の条件を満たす文字列を検索したい時などあると思います。
その場合、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 パターン を参考にしてください。