POSポス関数

本ページには広告が含まれています。

文字列内で探す文字(部分文字列)が最初に現れる位置を返します。

構文
  1. LongWord = POS( 探す文字, 探される文字列, n個目 )
  2. LongWord = POSB( 探す文字, 探される文字列, n個目 )
引数
探す文字 (String)必須
探したい文字列
探される文字列 (String)必須
探される文字列
n個目 (Integer = 0)省略可
nを指定するとn個目の文字位置を返す(マイナス値で指定すると後ろからサーチ)
戻り値

見つかった位置 (1から)

(見つからなければゼロを返す)

(大文字,小文字の区別はしません)

※ANSI(バイト)処理の場合は POSB

使い方

部分文字列(1文字)が最初に現れる場所を取得

東京都台東区東上野という文字列内でが最初に現れる位置を返します。東京都の位置なので1を返します。

UWSC
PRINT POS("東", "東京都台東区東上野")
結果
プレーンテキスト
1

第3引数にマイナス値を指定すると後ろから検索します。

東上野の位置である7を返します。

UWSC
PRINT POS("東", "東京都台東区東上野", -1)
結果
プレーンテキスト
7

部分文字列(2文字以上)が最初に現れる場所を取得

2文字以上の部分文字列を指定したときは、その部分文字列に完全に一致する場所を取得します。位置は部分文字列の1文字目の位置です。以下の場合"東京都"台東区東上野の位置である1東京都"台東区"東上野の位置である4が返ります。

UWSC
PRINT POS("東京都", "東京都台東区東上野")
PRINT POS("台東区", "東京都台東区東上野")
結果
プレーンテキスト
1
4

アルファベット

大文字・小文字の区別をしないためsの位置である3が返ります。

UWSC
PRINT POS("s", "UWSC")
結果
プレーンテキスト
3

大文字も小文字を区別して探したい場合は、OPTION指定SAMESTRを指定します。

UWSC
OPTION SAMESTR

PRINT POS("S", "UWSC")
PRINT POS("s", "UWSC")
結果
プレーンテキスト
3
0

部分文字列が何個あるか

ループでカウント

POS関数は部分文字列が見つからない場合0を返すので、i番目を調べ0になるまでカウントしていきます。

UWSC
DIM i = 0
WHILE POS("東", "東京都台東区東上野") <> 0
	i = i + 1
WEND

PRINT i
結果
プレーンテキスト
3
配列にしてカウント

SPLIT関数で区切り文字列として探したい文字列を指定して配列を作成し、その配列の最大インデックスが探したい文字列の数と一致します。

UWSC
DIM array = SPLIT("東京都台東区東上野", "東")
PRINT RESIZE(array)  // [] = "", "京都台", "区", "上野"
結果
プレーンテキスト
3
探す文字列を置換して差を求める
UWSC
DIM str = "東京都台東区東上野"
PRINT LENGTH(str) - LENGTH(REPLACE(str, "東", ""))
結果
プレーンテキスト
3

文字列が存在するかを調べる

UWSC
IF POS(探す文字列, 探される文字列) <> 0 THEN
	存在するときの処理
ELSE
	存在しないときの処理
ENDIF

部分文字列が何Byte目に現れるか

全角文字は2バイトなので「い」は3Byte目に現れることになります。

UWSC
PRINT POSB("い", "あいうえお")
結果
プレーンテキスト
3

指定文字が何Byteか調べるにはLENGTHB関数を使います。

UWSC
PRINT LENGTHB("あ")
結果
プレーンテキスト
2

プログラム実行例

デフォルトプリンターを取得

UWSC
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
使用関数

ファイルを開いているプロセスを調べる

UWSC
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
使用関数
解説

音量を取得

UWSC
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