〜 テキスト 〜
テキスト後ろから検索

キーワードのある位置を検索するinstr命令・関数の逆バージョンで、テキストの後ろから検索します。
現在はgetpath命令・関数があるので、この目的のためにあえて使用することはありませんが、
フルパスから拡張子だけを抜き出したり、ファイル名のみを抜き出したりすることができます。
下記のサンプルでは、最後尾からだけではなく、(終点の)開始位置を指定できますので、
テキストの最後にある「¥」を(終点の)開始位置として、もう1つ前にある「¥」の位置を検索する…と出来、
「ファイルが直接入っているフォルダパスを取得する」等の概ね後ろ側にある文字位置の取得に役立ちます。
サブディレクトリ名の取得であれば、以上の仕様でもサブディレクトリ名の開始位置を正常に取得できますが、
ルートディレクトリに直接おかれている場合は、−1が返るので、位置の取得に失敗してしまいます。
コレに対応するため(だけ?)「検索しても見つからなかったら、0を返す」というオプションを設けました。
通常のinstr命令・関数同様に「見つからないなら−1を返す」というので問題がないなら、
オプションパラメータに0を指定または省略してください。
	
instrrev 対象変数, キーワード, 開始位置, オプション
対象変数検索対象の文字列型変数を指定する。
尚、検索結果の文字位置はstatに返される。
キーワード検索文字を指定する。
開始位置文字列終端からの開始位置を指定する。
オプション該当しなかったときの戻り値を「−1のまま」(=0)か「0に置き換える」(=1)かを指定する。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#module
#deffunc instrrev val, str, int, int
	mref v,24 : mref search, 33 : mref start, 2 : mref notfound, 3
	mref stt, 64
	i = 0
	repeat
		instr i.1, v, search, i
		if start > 0 : if i + i.1 + 1 >= start : break
		if i.1 = -1 : break
		i += i.1 + 1
	loop
	instr i.1, v, search, i - 1
	stt = i
	if i.1 = 0 : return : else : if notfound = 0 : stt = -1
	return
#global

	dialog "", 16
	s = refstr
	instrrev s, "\\"
	i = stat
	if i ! -1 {
		getpath file, s, 8
		mes file + "が入っている直接のフォルダ名"
		instrrev s, "\\", i, 1
		instr i.1, s, "\\", stat
		strmid s, s, stat, i.1
		mes s
	}
	stop
検索位置 = instrrev(対象変数, キーワード, 開始位置, オプション)
検索位置検索結果の受取先を指定する。
対象変数検索対象の文字列型変数を指定する。
キーワード検索文字を指定する。
開始位置文字列終端からの開始位置を指定する。
オプション該当しなかったときの戻り値を「−1のまま」(=0)か「0に置き換える」(=1)かを指定する。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#module
#defcfunc instrrev var v, str search, int start, int notfound, local i
	repeat
		if start > 0 : if i + instr(v, i, search) + 1 >= start : break
		if instr(v, i, search) = -1 : break
		i += instr(v, i, search) + 1
	loop
	if instr(v, i - 1, search) = 0 : return i : else : if notfound = 0 : return -1
	return i
#global

	dialog "", 16
	s = refstr
	i = instrrev(s, "\\")
	if i ! -1 {
		mes getpath(s, 8) + "が入っている直接のフォルダ名"
		mes strmid(s, instrrev(s, "\\", i, 1), instr(s, instrrev(s, "\\", i, 1), "\\"))
	}