BETWEENSTRビトゥイーンストリング関数

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

指定文字列間の文字列を返します。

構文
  1. UString = BETWEENSTR( 文字列, 前文字, 後文字, n個目, 数え方フラグ )
引数
文字列 (String)必須
探す元になる文字列
前文字 (String = "")省略可
得たい文字列の前にある文字列(省略した場合は先頭から)
後文字 (String = "")省略可
得たい文字列の後にある文字列(省略した場合は最後まで)
n個目 (Integer = 1)省略可
nを指定するとn個目の該当文字列を返す(マイナス値で指定すると後ろからサーチ)
数え方フラグ (Boolean = False)省略可
FALSE
n個目は後文字以降でカウント (デフォルト)
TRUE
n個目は前文字以降でカウント
戻り値

使い方

ABCDEFGHIJKLMNという文字列からCEの間にある文字列を取得します。

UWSC
PRINT BETWEENSTR("ABCDEFGHIJKLMN", "C", "E")
結果
プレーンテキスト
D

前文字と後文字の間の文字数は1文字に限らず取得できます。

UWSC
PRINT BETWEENSTR("ABCDEFGHIJKLMN", "C", "G")
結果
プレーンテキスト
DEF

文字列が見つからなかった場合はEmptyを返します。

UWSC
PRINT BETWEENSTR("ABCDEFGHIJKLMN", "C", "B")

前文字を省略した場合、先頭の文字からサーチします。

UWSC
PRINT BETWEENSTR("ABCDEFGHIJKLMN",, "G")
結果
プレーンテキスト
ABCDEF

後文字を省略した場合、末尾の文字まで取得します。

UWSC
PRINT BETWEENSTR("ABCDEFGHIJKLMN", "J")
結果
プレーンテキスト
KLM

前文字・後文字は省略可能ですが、どちらか片方は指定する必要があります。どちらも省略した場合はBETWEENSTR:引数が足りませんとエラーが発生します。

UWSC
PRINT BETWEENSTR("ABCDEFGHIJKLMN")

第四引数のn個目に値を指定した場合、n個目に見つかった文字列を返します。「ABCDEACBDEADCBE」という文字列の赤色が1個目、青色が2個目、緑色が3個目に見つかった文字列です。4個目は見つからないのでEEmptyを返します。

UWSC
DIM str = "ABCDEACBDEADCBE"

PRINT BETWEENSTR(str, "A", "E", 1)
PRINT BETWEENSTR(str, "A", "E", 2)
PRINT BETWEENSTR(str, "A", "E", 3)
PRINT BETWEENSTR(str, "A", "E", 4)
結果
プレーンテキスト
BCD
CBD
DCB

後ろからサーチする場合は、後ろから1個目は-1、2個目は-2のようにマイナス値で指定します。

UWSC
DIM str = "ABCDEACBDEADCBE"

PRINT BETWEENSTR(str, "A", "E", -1)
PRINT BETWEENSTR(str, "A", "E", -2)
PRINT BETWEENSTR(str, "A", "E", -3)
PRINT BETWEENSTR(str, "A", "E", -4)
結果
プレーンテキスト
DCB
CBD
BCD

n個目に0を指定すると1を指定したときと同じ結果を返します。

UWSC
DIM str = "ABCDEACBDEADCBE"

PRINT BETWEENSTR(str, "A", "E", 0)
PRINT BETWEENSTR(str, "A", "E", 1)
結果
プレーンテキスト
BCD
BCD

数え方フラグは前文字と後文字に同じ文字を指定したとき、2個目以降のどの位置からサーチするかを指定するための引数です。

例えば、「A12, B12, C12, A34, B34, C34, A56, B56, C56, A78, B78, C78」という文字列でAAで囲まれた文字列をサーチするとき、2個目を探すときにデフォルトでは後文字以降なので「A12, B12, C12, A34, B34, C34, A56, B56, C56, A78, B78, C78」の赤色の範囲(後文字のA以降)でサーチを行います。これを数え方フラグにTRUEを指定し前文字以降にすると「A12, B12, C12, A34, B34, C34, A56, B56, C56, A78, B78, C78」の範囲(前文字のA以降)でサーチが行われることになり、結果が変わります。

UWSC
DIM str = "A12, B12, C12, A34, B34, C34, A56, B56, C56, A78, B78, C78"

PRINT BETWEENSTR(str, "A", "A", 1)
PRINT BETWEENSTR(str, "A", "A", 2)
PRINT BETWEENSTR(str, "A", "A", 2, TRUE)
結果
プレーンテキスト
12, B12, C12, 
56, B56, C56, 
34, B34, C34,

プログラム実行例

UWSC.INIのDefaultFontを変更する

UWSC
CONST ssfFONTS = 20

DIM Shell = CREATEOLEOBJ("Shell.Application")
DIM Folder = Shell.NameSpace(ssfFONTS)
DIM FolderItems = Folder.Items
DIM array[-1]

FOR FolderItem IN FolderItems
	arrayPush(array, FolderItem.Name)
NEXT

QSORT(array, QSRT_UNICODEA)
SHIFTARRAY(array, 1)
array[0] = "(なし)"

DIM filename = "C:\Users\" + BETWEENSTR(DOSCMD("SET"), "USERNAME=", "<#CR>") + "\AppData\Roaming\UWSC\UWSC.INI"
DIM str = SPLIT(READINI("SET", "DefaultFont", filename), ",")[0]
DIM font = SLCTBOX(SLCT_CMB OR SLCT_STR, 0, "フォントを選択してください。(現在:" + str + ")", array)

IF font = "(なし)" THEN font = ""
IF font <> -1 THEN WRITEINI("SET", "DefaultFont", font + ",", filename)

//////////////////////////////////////////////////
// 【引数】
//   array : 要素を追加する配列(参照引数) 
//   values : 追加する要素をvalue1から指定 
// 【戻り値】
//   処理後の配列の要素の数 
//////////////////////////////////////////////////
FUNCTION arrayPush(var array[], value1 = EMPTY, value2 = EMPTY, value3 = EMPTY, value4 = EMPTY, value5 = EMPTY, value6 = EMPTY, value7 = EMPTY, value8 = EMPTY, value9 = EMPTY, value10 = EMPTY, value11 = EMPTY, value12 = EMPTY, value13 = EMPTY, value14 = EMPTY, value15 = EMPTY, value16 = EMPTY)
    DIM i = 1
    WHILE EVAL("value" + i) <> EMPTY
	  DIM res = RESIZE(array, UBound(array) + 1)
	  array[res] = EVAL("value" + i)
	  i = i + 1
	WEND
	RESULT = LENGTH(array)
FEND

//////////////////////////////////////////////////
// 【引数】
//   section : セクション 
//   key : キー(Delete関数は省略可) 
//   value : 値 
//   path : INIファイルのパス 
//   default : セクションとキーが存在しなかった場合に返す値 
// 【戻り値】
//   
//////////////////////////////////////////////////
MODULE INI
	DEF_DLL GetPrivateProfileStringW(wstring,wstring,wstring,var pwchar,dword,wstring):dword:kernel32
	DEF_DLL WritePrivateProfileStringW(wstring,wstring,wstring,wstring):bool:kernel32
	FUNCTION Read(section = NULL, key = NULL, path = NULL, default = EMPTY)
		DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
		IFB path = NULL THEN
			path = FSO.GetAbsolutePathName(FSO.GetBaseName(GET_UWSC_NAME) + ".INI")
		ELSE
			path = FSO.GetAbsolutePathName(path)
		ENDIF
		DIM n = 1024
		DIM buffer = FORMAT(CHR(0), n)
		IFB GetPrivateProfileStringW(section, key, default, buffer, n, path) = 0 THEN
			RESULT = default
		ELSE
			RESULT = SLICE(SPLIT(buffer, CHR(0), TRUE))
			IF section <> NULL AND key <> NULL THEN RESULT = RESULT[0]
		ENDIF
	FEND
	FUNCTION Write(section, key, value, path = NULL)
		DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
		IFB path = NULL THEN
			path = FSO.GetAbsolutePathName(FSO.GetBaseName(GET_UWSC_NAME) + ".INI")
		ELSE
			path = FSO.GetAbsolutePathName(path)
		ENDIF
		RESULT = WritePrivateProfileStringW(section, key, value, path)
	FEND
	PROCEDURE Delete(section, key = NULL, path = NULL)
		DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
		IFB path = NULL THEN
			path = FSO.GetAbsolutePathName(FSO.GetBaseName(GET_UWSC_NAME) + ".INI")
		ELSE
			path = FSO.GetAbsolutePathName(path)
		ENDIF
		PRINT WritePrivateProfileStringW(section, key, NULL, path)
	FEND
	FUNCTION escape(value)
		DIM esc = ";#=:"
		FOR i = 1 TO LENGTH(esc)
			DIM s = COPY(esc, i, 1)
			value = REPLACE(value, s, "\" + s)
		NEXT
		RESULT = value
	FEND
	FUNCTION unescape(value)
		DIM esc = ";#=:"
		FOR i = 1 TO LENGTH(esc)
			DIM s = COPY(esc, i, 1)
			value = REPLACE(value, "\" + s, s)
		NEXT
		RESULT = value
	FEND
ENDMODULE

//////////////////////////////////////////////////
// 【引数】
//   inputs : 繰り返す文字列 
//   multiplier : inputsを繰り返す回数 
// 【戻り値】
//   inputsをmultiplier回を繰り返した文字列を返します 
//////////////////////////////////////////////////
FUNCTION strRepeat(inputs, multiplier)
	DIM res = ""
	FOR n = 1 TO multiplier
		res = res + inputs
	NEXT
	RESULT = res
FEND

//////////////////////////////////////////////////
// 【引数】
//   arrayname : 上限値を求める配列の名前 
//   dimension : 返す次元を示す整数 
// 【戻り値】
//   配列の上限値 
//////////////////////////////////////////////////
FUNCTION UBound(arrayname[], dimension = 1)
	RESULT = EVAL("RESIZE(arrayname" + strRepeat("[0]", dimension - 1) + ")")
FEND
使用関数

関連記事

LENGTH関数 (スクリプト関数)
REPLACE関数 (スクリプト関数)
STRCONV関数 (スクリプト関数)
strPad関数 (自作関数)
指定した長さまで、文字列の左側または右側を他の文字列で埋めます。
substrReplace関数 (自作関数)