本ページには広告が含まれています。
目次
文字列内で探す文字(部分文字列)が最初に現れる位置を返します。
- 構文
- LongWord = POS( 探す文字, 探される文字列, n個目 )
- LongWord = POSB( 探す文字, 探される文字列, n個目 )
- LongWord = POS( 探す文字, 探される文字列, n個目 )
- 引数
- 探す文字 (String)必須
- 探したい文字列
- 探される文字列 (String)必須
- 探される文字列
- n個目 (Integer = 0)省略可
- nを指定するとn個目の文字位置を返す(マイナス値で指定すると後ろからサーチ)
- 戻り値
見つかった位置 (1から)
(見つからなければゼロを返す)
(大文字,小文字の区別はしません)
※ANSI(バイト)処理の場合は POSB
使い方
部分文字列(1文字)が最初に現れる場所を取得
東京都台東区東上野という文字列内で東が最初に現れる位置を返します。東京都の東の位置なので1を返します。
PRINT POS("東", "東京都台東区東上野")
- 結果
1
第3引数にマイナス値を指定すると後ろから検索します。
東上野の東の位置である7を返します。
PRINT POS("東", "東京都台東区東上野", -1)
- 結果
7
部分文字列(2文字以上)が最初に現れる場所を取得
2文字以上の部分文字列を指定したときは、その部分文字列に完全に一致する場所を取得します。位置は部分文字列の1文字目の位置です。以下の場合"東京都"台東区東上野の東の位置である1、東京都"台東区"東上野の台の位置である4が返ります。
PRINT POS("東京都", "東京都台東区東上野")
PRINT POS("台東区", "東京都台東区東上野")
- 結果
1 4
アルファベット
大文字・小文字の区別をしないためsの位置である3が返ります。
PRINT POS("s", "UWSC")
- 結果
3
大文字も小文字を区別して探したい場合は、OPTION指定でSAMESTRを指定します。
OPTION SAMESTR
PRINT POS("S", "UWSC")
PRINT POS("s", "UWSC")
- 結果
3 0
部分文字列が何個あるか
ループでカウント
POS関数は部分文字列が見つからない場合0を返すので、i番目を調べ0になるまでカウントしていきます。
DIM i = 0
WHILE POS("東", "東京都台東区東上野") <> 0
i = i + 1
WEND
PRINT i
- 結果
3
配列にしてカウント
SPLIT関数で区切り文字列として探したい文字列を指定して配列を作成し、その配列の最大インデックスが探したい文字列の数と一致します。
DIM array = SPLIT("東京都台東区東上野", "東")
PRINT RESIZE(array) // [] = "", "京都台", "区", "上野"
- 結果
3
探す文字列を置換して差を求める
DIM str = "東京都台東区東上野"
PRINT LENGTH(str) - LENGTH(REPLACE(str, "東", ""))
- 結果
3
文字列が存在するかを調べる
IF POS(探す文字列, 探される文字列) <> 0 THEN
存在するときの処理
ELSE
存在しないときの処理
ENDIF
部分文字列が何Byte目に現れるか
全角文字は2バイトなので「い」は3Byte目に現れることになります。
PRINT POSB("い", "あいうえお")
- 結果
3
指定文字が何Byteか調べるにはLENGTHB関数を使います。
PRINT LENGTHB("あ")
- 結果
2
プログラム実行例
デフォルトプリンターを取得
CONST ssfPRINTERS = 4
DIM Shell = CREATEOLEOBJ("Shell.Application")
DIM Folder = Shell.NameSpace(ssfPRINTERS)
DIM FolderItems = Folder.Items
HASHTBL iColumn
FOR n = 0 TO 350
iColumn[Folder.GetDetailsOf(EMPTYPARAM, n)] = n
NEXT
FOR n = 0 TO FolderItems.Count - 1
DIM FolderItem = FolderItems.Item(n)
DIM PrinterName = Folder.GetDetailsOf(FolderItem, iColumn["名前"])
FOR i = 0 TO FolderItem.Verbs.Count - 1
IF POS("通常使うプリンターに設定", FolderItem.Verbs.Item(i).Name) <> 0 THEN CONTINUE 2
NEXT
PRINT PrinterName
BREAK
NEXT
結果
Brother DCP-J963N Printer
使用関数
ファイルを開いているプロセスを調べる
SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")
CONST TemporaryFolder = 2
DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
WITH FSO
DIM Folder = .GetSpecialFolder(TemporaryFolder)
DIM folderspec = Folder.Path
DIM filename = .GetTempName
DIM path = .BuildPath(folderspec, filename)
ENDWITH
DIM Shell = CREATEOLEOBJ("Shell.Application")
Shell.FileRun()
DIM ID = GETID("ファイル名を指定して実行", "#32770")
SENDSTR(ID, "cmd /c openfiles /query /fo CSV > " + path)
CLKITEM(ID, "OK", CLK_BTN)
SLEEP(0.500)
REPEAT
SLEEP(0.100)
UNTIL GETID("C:\WINDOWS\system32\cmd.exe", "ConsoleWindowClass") = -1
DIM FID = FOPEN(path, F_READ)
TRY
DIM ID2 = GETID("使用中", "OperationStatusWindow")
GETITEM(ID2, ITM_ACCTXT, 1)
DIM str = ALL_ITEM_LIST[1]
DIM sep = IIF(POS("フォルダー", STATUS(ID2, ST_TITLE)) <> 0, "\", "")
DIM msg = "■" + str + "<#CR>"
FOR r = 5 TO FGET(FID, F_LINECOUNT)
IF POS("\" + str + sep, FGET(FID, r, 3)) <> 0 THEN
msg = msg + "ID:" + FGET(FID, r, 1) + ", プロセス名:" + FGET(FID, r, 2) + "<#CR>"
ENDIF
NEXT
FCLOSE(FID)
REPEAT
FUKIDASI(TRIM(msg))
SLEEP(0.100)
UNTIL GETID("使用中", "OperationStatusWindow") = -1
FINALLY
FSO.DeleteFile(path)
ENDTRY
//////////////////////////////////////////////////
// 【引数】
//
// 【戻り値】
//
//////////////////////////////////////////////////
PROCEDURE forceQuit()
EXITEXIT
FEND
//////////////////////////////////////////////////
// 【引数】
// expr : 評価する式
// truepart : 評価した式がTrueのときに返す値
// falsepart : 評価した式がFalseのときに返す値
// 【戻り値】
// truepart : 評価した式がTrueのとき、falsepart : 評価した式がFalseのとき
//////////////////////////////////////////////////
FUNCTION IIF(expr, truepart, falsepart)
IFB EVAL(expr) THEN
RESULT = truepart
ELSE
RESULT = falsepart
ENDIF
FEND
使用関数
解説
音量を取得
GETITEM(GETID("", "Shell_TrayWnd"), ITM_TOOLBAR)
FOR item IN ALL_ITEM_LIST
IFB POS("スピーカー: ", item) <> 0 THEN
PRINT REPLACE(REPLACE(item, "スピーカー: ", ""), "%", "")
BREAK
ENDIF
NEXT
結果
10
使用関数