Last Update : 2008/08/xx
文字列や文字列型変数に指定した文字が含まれているかを検索する関数です。関数名の由来は、「in string」から。
HSP2では命令形式で提供されてきましたが、HSP3では関数形式に変更されています。書き方が変わっただけで、機能的な違いはありません。
instr(文字列型変数, 検索開始位置, "検索する文字")
第1パラメータには検索対象となる文字列が代入された変数を指定します。第2パラメータには検索開始の基点となる位置(0〜)を指定します。0を指定(省略可)すれば先頭から検索することになります。最後のパラメータは検索する文字です。
検索する文字が見つからなかった場合は-1が返り、見つかった場合は0から始まる位置(インデックス)が返ります。単位にはバイトです。
instr関数を使った簡単なサンプルスクリプト。HSP3から関数形式に変更されたことで、instr関数をmes命令に直接指定することができます。
data = "ABCDEFGHIJK" mes data ; 先頭から検索 mes " 「I」の位置:"+instr(data, , "I") ; 「F」が検索開始位置 (開始位置を基点とした結果が返ることに注意) mes " 「I」の位置:"+instr(data, 5, "I") ; 検索する文字は何文字でも mes " 「DEF」の位置:"+instr(data, , "DEF") ; 存在しない mes " 「XY」の位置:"+instr(data, , "XY")
拡張子をチェックするサンプルコードです。ただ、これは単純に「.exe」という文字が含まれているかどうかを確認してるだけなので、たとえば途中に文字が含まれていたら誤判定します。その下はこれを解決したものです。
// 拡張子チェック1 (by Kpan) path = "C:\\Program Files\\hsp31\\hsed3.exe" ; path = "C:\\Program Files\\hsp31\\hsed3.exe.zip" value = instr(path, , ".exe") if value = -1 { mes "「.exe」なし" } else { mes "「.exe」あり" }
// 拡張子チェック2 (by Kpan) path = "C:\\Program Files\\hsp31\\hsed3.exe" ; path = "C:\\Program Files\\hsp31\\hsed3.exe.zip" value = instr(path, , ".exe") if value = -1 { mes "「.exe」なし" } else { ; 文字の末尾かをチェック if value + 4 = strlen(path) { mes "「.exe」あり+拡張子" } else { mes "「.exe」あり" } }
上のサンプルコードはinstr関数の説明のためにあえて用意したもので、拡張子の確認はgetpath関数(モード2)を利用してファイルパスを分解した方が楽です。
検索する文字が複数個含まれている場合は、instr関数の第2パラメータにある検索開始位置をうまく利用します。1つ目の文字が見つかったら、以降は検索開始位置をずらす形です。
// 複数回検索 (by Kpan) data = "Hi, my name is HSP!" mes data i = 0 repeat ; 半角スペースを検索 value = instr(data, i, " ") ; 見つからなかったらループを抜ける if value = -1 : count = cnt : break mes ""+i+"+"+value+" バイト目" ; 次の検索開始基点位置 i + value + 1 loop mes "★ "+count+" ヶ所あったよ"
文字列を切り出すgetstr命令と組み合わせて、半角文字や全角文字(複数文字)にはさまれた文字を取り出してみます。(文字列を切り出し処理はstrmid関数でも可能)
// 半角文字でくくられてる場合 (by Kpan) sdim buf data = "このページはHSPの「instr関数講座」だよ〜ん。" mes data getstr buf, data, instr(data, , "「") + 1, '」' mes buf
// 全角文字や複数文字でくくられてる場合 (by Kpan) sdim buf data = "このページはHSP3の▼instr関数▲講座だよ〜ん。" mes data value = instr(data, , "▼") + 2 getstr buf, data, value, , instr(data, value, "▲") mes buf