指定文字列間の文字列を返します。
- 構文
- UString = BETWEENSTR( 文字列, 前文字, 後文字, n個目, 数え方フラグ )
- 引数
- 文字列 (String)必須
- 探す元になる文字列
- 前文字 (String = "")省略可
- 得たい文字列の前にある文字列(省略した場合は先頭から)
- 後文字 (String = "")省略可
- 得たい文字列の後にある文字列(省略した場合は最後まで)
- n個目 (Integer = 1)省略可
- nを指定するとn個目の該当文字列を返す(マイナス値で指定すると後ろからサーチ)
- 数え方フラグ (Boolean = False)省略可
- FALSE
- n個目は後文字以降でカウント (デフォルト)
- TRUE
- n個目は前文字以降でカウント
- 戻り値
使い方
ABCDEFGHIJKLMNという文字列からCとEの間にある文字列を取得します。
PRINT BETWEENSTR("ABCDEFGHIJKLMN", "C", "E")
- 結果
D
前文字と後文字の間の文字数は1文字に限らず取得できます。
PRINT BETWEENSTR("ABCDEFGHIJKLMN", "C", "G")
- 結果
DEF
文字列が見つからなかった場合はEmptyを返します。
PRINT BETWEENSTR("ABCDEFGHIJKLMN", "C", "B")
前文字を省略した場合、先頭の文字からサーチします。
PRINT BETWEENSTR("ABCDEFGHIJKLMN",, "G")
- 結果
ABCDEF
後文字を省略した場合、末尾の文字まで取得します。
PRINT BETWEENSTR("ABCDEFGHIJKLMN", "J")
- 結果
KLM
前文字・後文字は省略可能ですが、どちらか片方は指定する必要があります。どちらも省略した場合はBETWEENSTR:引数が足りませんとエラーが発生します。
PRINT BETWEENSTR("ABCDEFGHIJKLMN")
第四引数のn個目に値を指定した場合、n個目に見つかった文字列を返します。「ABCDEACBDEADCBE」という文字列の赤色が1個目、青色が2個目、緑色が3個目に見つかった文字列です。4個目は見つからないのでEEmptyを返します。
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のようにマイナス値で指定します。
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を指定したときと同じ結果を返します。
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」という文字列でAとAで囲まれた文字列をサーチするとき、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以降)でサーチが行われることになり、結果が変わります。
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を変更する
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を繰り返す回数
// 【戻り値】
//
//////////////////////////////////////////////////
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関数 (自作関数)
- 文字列の一部を置換します。