その15 文字列の検索

その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をダウンロード。


その16に行く

目次に戻る