その1.単純な文字列検索
;search2.as ;文字列内の該当ワードをサーチする ;1行内のもの ;文字列内に複数の該当ワードが存在する場合は、 ;始めのワードにマッチする ;hct - hit offset (-1 is no hit!) tr="The dead dosen't have a call of nature." cpw="call" instr hct,tr,cpw mes "0123456789012345678901234567890123456789" mes tr if hct=-1:mes "no hit" mes "hit <"+cpw+"> "+hct stop
文字列の検索のサンプルです。
twに検索対象(1行の文)、cpwに検索する文字(検索キーワード)をいれてるとhctに値が入ります。
hitしない場合は−1。
hitした場合はそのオフセットが入ります。
また、1行中に何度かcpwが登場しても、最初のhitしかみていません。
cpwの最初の1文字が無いかをloopしながら探します。
cpwの内容をいろいろ変えて試してみましょう。
数字が並んでいるのは何文字目かという、ものさしがわりに使います。
2.複数マッチする文字列検索
;searchm.as ;サーチ対象に複数のマッチがある時はこうしよう! tr="test program is testing now. test is end." strlen trl,tr cpw="test" str hbuf i=0 *searchlp instr hct,tr,cpw,i if hct=-1:goto *searchend ii=i+hct hbuf=hbuf+ii+":" i=i+hct+1 if i>=trl:goto *searchend goto *searchlp *searchend mes "0123456789012345678901234567890123456789" mes tr mes hbuf stop
上のサンプルプログラムでは、調べている単語が何度も出てくる(マッチする)場合に、困ってしまいます。
instr命令では、ワードサーチのオフセットを設定できるので、その機能を利用することにします。
さて、ここで、注意しなければいけないのは、オフセット指定をして、instr命令を実行した場合の答えです。
選られる答えは、ワードを発見しなかった場合-1、そして発見した場合はサーチ時のオフセットからのオフセットになります。
ちょっと、複雑ですね。
たとえばtr="abcdefabc"というワード内を"bc"というワードで検索する場合。
「instr c,tr,"bc",0」でサーチを始めると、結果のcには1が入ります。
当然次のサーチは1+1の場所から行う必要がありますね。
そうすると答えは5です。
元のtrという変数のオフセットでは7の位置にあるので、混乱するかも知れませんが、 検索スタート位置からのオフセットだという事を覚えておいてください。
2.4d以前のバージョンの文字列の検索はこちら。
以前のHSPでは文字列の検索命令をサポートしていません。
search2.zipをダウンロード。