MikoScript 言語仕様
文字列操作
本章では、主に文字列操作に関連する以下のシステム組み込みリレー型関数について
説明しています。
文字列→数値への変換
'int 文字列 → 整数値
'float 文字列 → 浮動小数点数値
数値→文字列への変換
'd 数値 → 10進表記文字列
'x 数値 → 16進表記文字列
'o 数値 → 8進表記文字列
'b 数値 → 2進表記文字列
'f 数値 → f 型実数表記文字列
'e 数値 → e 型実数表記文字列
'g 数値 → g 型実数表記文字列
'c 文字コード → 文字列
書式変換
'fmt 書式指定文字列への変換
部分抽出/整形/反復/変位/補修
'part 部分抽出 or 部分置換
's 桁幅内配置調整
'trim 左右端空白除去
'rep 反復
'shift シフト
'rotate 回転
'reverse 逆順
'mend 補修
バイト数/字数/コード/字種の取得
'cn 文字列のバイト数
'kn 文字列の字数
'chcode 文字列内の文字のコード値
'chtype 文字コードの種別
字種変換
'upper 英小文字 → 英大文字
'lower 英大文字 → 英小文字
'capit 英頭文字化
'toZenk 半角 → 全角
'toHank 全角 → 半角
'toHira カタカナ → ひらかな
'toKata ひらかな → カタカナ
比較
'icmp 英字大小区別なし文字列比較
'wcmp ワイルドカード文字列比較
正規表現による操作
'match 一致部の検出
'split 一致部で分割
'field 一致部で区切
'subst 一致部の置換
囲い,CSV,SSV操作
'quote 引用符の付加
'dequote 引用符の除去
'csv CSV適合化
'ssv SSV適合化
演算子による文字列の操作は、「演算子」の章内の次の各節で述べています。
・算術二項演算子
・比較演算子
・論理演算子
純粋配列での文字列の操作は、「純粋配列」の章内の次の節で述べています。
・純粋配列の要素データ上の文字コード列の操作
●文字列→数値への変換
T'int( n ) → 整数値
機能: 対象の文字列 T を整数値に変換します( n は進数を指定 )
説明: n が省略/不正時、対象の文字列は、10進数として扱われます。
n = 2〜36 の時、対象の文字列は n 進数として扱われます。この場合、
対象の文字列の先頭に、+ または - の符号があっても構いません。
対象の文字列内の a〜z または、A〜Z は、10 以上の数字に対応します。
n = 0 の時、対象の文字列が、
"0x" または "0X" で始まっていれば 16進数、
"0" で始まっていれば 8進数、
それ以外は、10進数として扱われます。
n = -2 〜 -36 の時、対象の文字列は -n 進数として扱われます。この場合、
基本的に、n = 2〜36 の時と同じですが、返値は、符号なしの 32-bit 値に
なります。
n がそれ以外の時、結果は不定です。
対象の文字列の最初にある空白文字は、読み飛ばされます。
対象の文字列内に、想定外の文字があれば、そこで変換は終って、その時点での
値を返します。なお、変換開始時の初期値は、0 です。
変換時にオーバーフローがあった場合の返値は、未定義です。
対象の入出力形式に、BYTE, UBYTE, SHORT, USHORT が設定されている場合には、
これに応じた値を返します。なお、これ以外の入出力形式は無視されます。
補説: 'int の対象が浮動小数点数値の場合、それを整数値に変換した値を返します。
'int の対象が整数値の場合、その値自身を返します。
但し、いずれの場合でも、その対象に、上述の入出力形式が設定されていれば、
それに応じた値になります。
'int の対象が、文字列でも数値でもなければ、null を返します。
用例:
print "123"'int; // → 123
print "-456"'int; // → -456
print "1A"'int(16); // → 26
print "1100"'int(2); // → 12
A = "78";
print ( A + "90" )'int; // → 7890
print 1000.0'int; // → 1000
print "0x3F"'int(0); // → 63
print "012"'int(0); // → 10
print "0x81"'BYTE'int(0); // → -127
print "0xA001C"'USHORT'int(0); // → 28
T'float → 浮動小数点数値
機能: 対象の文字列 T を浮動小数点数値に変換します
説明: 対象の文字列は、浮動小数点数値、または、10進の整数値を表記している文字列
として解釈されます。
対象の文字列の最初にある空白文字は、読み飛ばされます。
対象の文字列内に、想定外の文字があれば、そこで変換は終って、その時点での
値を返します。なお、最初から想定外の文字なら、0.0 を返します。
変換時にオーバーフローがあった場合の返値は、未定義です。
補説: 'float の対象が整数値の場合、その浮動小数点数値を返します。
'float の対象が浮動小数点数値の場合、その値自身を返します。
'float の対象に入出力形式が設定されていても無視されます。
'float の対象が、文字列でも数値でもなければ、null を返します。
用例:
print "12.3"'float; // → 12.3
print "-4.56E+10"'float; // → -4.56e+010
A = "-78";
print ( A + ".90" )'float; // → -78.9
●数値→文字列への変換
T'd( n, w ) → 10進表記文字列
機能: 対象 T の整数値を 10進表記文字列に変換します
説明: 引数 n は、出力される 10進数字列の桁数を指定します。
なお、以降で、N は、T の 16進表記に実質的に必要な最小限の桁数です。
この N には、+ や - の符号は含みません。
n が省略/不正の時、または、0 < n < N の時、n = N になります。
n > N の時、余分の上位桁は 0 で埋ります。
n > 32 の時、n = 32 として扱います。
n <= 0 の時、T が正なら、10進数字列の先頭に +(プラス)符号が付きます。
さらに、n = -n として、上記のように扱います。
T が負なら、10進数字列の先頭に -(マイナス)符号が付きます。
引数 w は、このように変換された文字列(以降 S と呼びます)の全桁幅を、
次のように調整します。なお、以降で、k は、文字列 S の桁数です。
w > k の時、全桁幅が w で、S を右詰めした文字列を返します。
-w > k の時、全桁幅が -w で、S を左詰めした文字列を返します。
-k <= w <= k または、w が省略/不正の時、S をそのまま返します。
なお、S を右詰め/左詰めする際、残りの桁は半角空白で埋められます。
全桁幅は、最大でも 32 桁までです。
補説: T が浮動小数点数値の場合、その整数部が対象になります。
T が数値以外の場合、null を返します。
用例:
#set q quote
print +123'd '#q; // → "123"
print +123'd(0) '#q; // → "+123"
print +123'd(5) '#q; // → "00123"
print +123'd(-5) '#q; // → "+00123"
print +123'd(,10) '#q; // → " 123"
print +123'd(0,10) '#q; // → " +123"
print +123'd(-5,-10)'#q; // → "+00123 "
print -123'd '#q; // → "-123"
print -123'd(0) '#q; // → "-123"
print -123'd(5) '#q; // → "-00123"
print -123'd(-5) '#q; // → "-00123"
print -123'd(,10) '#q; // → " -123"
print -123'd(0,10) '#q; // → " -123"
print -123'd(-5,-10)'#q; // → "-00123 "
print "ABC"'d; // → <null>
T'x( n, w ) → 16進表記文字列
機能: 対象 T の整数値を 16進表記文字列に変換します
説明: 引数 n は、出力される 16進数字列の桁数を指定します。
なお、以降で、N は、T の 16進表記に実質的に必要な最小限の桁数です。
n が省略/不正の時、または、n < N の時、n = N になります。
n > N の時、余分の上位桁は 0 で埋ります。
n > 32 の時、n = 32 として扱います。
引数 w は、このように変換された文字列(以降 S と呼びます)の全桁幅を、
次のように調整します。なお、以降で、k は、文字列 S の桁数です。
w > k の時、全桁幅が w で、S を右詰めした文字列を返します。
-w > k の時、全桁幅が -w で、S を左詰めした文字列を返します。
-k <= w <= k または、w が省略/不正の時、S をそのまま返します。
なお、S を右詰め/左詰めする際、残りの桁は半角空白で埋められます。
全桁幅は、最大でも 32 桁までです。
補説: 16進表記では、10進の 10〜15 の値は、A〜F になります。
これを a〜f にしたい場合は、'x に続けて 'lower とします。
16進表記では、T の正負とは無関係のため、+/- の符号は付きません。
T が浮動小数点数値の場合、その整数部が対象になります。
T が数値以外の場合、null を返します。
用例:
#set q quote
print 0xABC'x '#q; // → "ABC"
print 0xABC'x(5) '#q; // → "00ABC"
print 0xABC'x(,10) '#q; // → " ABC"
print 0xABC'x(5,-10)'#q; // → "00ABC "
print 123'x '#q; // → "7B"
print 123'x(5) '#q; // → "0007B"
print -456'x '#q; // → "FFFFFE38"
print -456'x(6) '#q; // → "FFFFFE38"
print -456'x'lower '#q; // → "fffffe38"
print 78.9'x '#q; // → "4E"
print "ABC"'x; // → <null>
T'o( n, w ) → 8進表記文字列
機能: 対象 T の整数値を 8進表記文字列に変換します
説明: 引数 n は、出力される 8進数字列の桁数を指定します。
なお、以降で、N は、T の 8進表記に実質的に必要な最小限の桁数です。
n が省略/不正の時、または、n < N の時、n = N になります。
n > N の時、余分の上位桁は 0 で埋ります。
n > 32 の時、n = 32 として扱います。
引数 w は、このように変換された文字列(以降 S と呼びます)の全桁幅を、
次のように調整します。なお、以降で、k は、文字列 S の桁数です。
w > k の時、全桁幅が w で、S を右詰めした文字列を返します。
-w > k の時、全桁幅が -w で、S を左詰めした文字列を返します。
-k <= w <= k または、w が省略/不正の時、S をそのまま返します。
なお、S を右詰め/左詰めする際、残りの桁は半角空白で埋められます。
全桁幅は、最大でも 32 桁までです。
補説: 8進表記では、T の正負とは無関係のため、+/- の符号は付きません。
T が浮動小数点数値の場合、その整数部が対象になります。
T が数値以外の場合、null を返します。
用例:
#set q quote
print 0b1`010`011'o '#q; // → "123"
print 0b1`010`011'o(7) '#q; // → "0000123"
print 0b1`010`011'o(,10) '#q; // → " 123"
print 0b1`010`011'o(5,-10)'#q; // → "00123 "
print 123'o '#q; // → "173"
print 123'o(5) '#q; // → "00173"
print -456'o '#q; // → "37777777070"
print -456'o(12) '#q; // → "037777777070"
print 78.9'o '#q; // → "116"
print "ABC"'o; // → <null>
T'b( n, w ) → 2進表記文字列
機能: 対象 T の整数値を 2進表記文字列に変換します
説明: 引数 n は、出力される 2進数字列の桁数を指定します。
なお、以降で、N は、T の 2進表記に実質的に必要な最小限の桁数です。
n が省略/不正の時、または、n < N の時、n = N になります。
n > N の時、余分の上位桁は 0 で埋ります。
n > 32 の時、n = 32 として扱います。
引数 w は、このように変換された文字列(以降 S と呼びます)の全桁幅を、
次のように調整します。なお、以降で、k は、文字列 S の桁数です。
w > k の時、全桁幅が w で、S を右詰めした文字列を返します。
-w > k の時、全桁幅が -w で、S を左詰めした文字列を返します。
-k <= w <= k または、w が省略/不正の時、S をそのまま返します。
なお、S を右詰め/左詰めする際、残りの桁は半角空白で埋められます。
全桁幅は、最大でも 32 桁までです。
補説: 2進表記では、T の正負とは無関係のため、+/- の符号は付きません。
T が浮動小数点数値の場合、その整数部が対象になります。
T が数値以外の場合、null を返します。
用例:
#set q quote
print 0b1010011'b '#q; // → "1010011"
print 0b1010011'b(8) '#q; // → "01010011"
print 0b1010011'b(,10) '#q; // → " 1010011"
print 0b1010011'b(5,-10)'#q; // → "1010011 "
print 123'b '#q; // → "1111011"
print 123'b(16) '#q; // → "0000000001111011"
print -456'b '#q; // → "11111111111111111111111000111000"
print -456'b(20) '#q; // → "11111111111111111111111000111000"
print 78.9'b '#q; // → "1001110"
print "ABC"'b; // → <null>
T'f( n, w ) → f 型実数表記文字列
機能: 対象 T の数値を f 型実数表記文字列に変換します
説明: f 型実数表記は、###.### の形式で実数値を表わします。
ここで、### は、何桁かの 10進数字列です。
+/- の符号がある場合は、この表記の先頭に付きます。
引数 n は、小数点以下何桁まで出力するかを指定します。
n が省略/不正の時、n = 6 として扱います。
n は 32 を超えても 32 として扱います。
n = 0 の時、小数点とそれ以下の桁は表記されません。
n の指定で切り取られる桁は、四捨五入されます。
n < 0 の時、T が正なら、先頭に +(プラス)符号が付きます。
さらに、n = -n として、上記のように扱います。
T が負なら、先頭に -(マイナス)符号が付きます。
整数部は、n の指定とは無関係に、その全桁が出力されます。
引数 w は、このように変換された文字列(以降 S と呼びます)の全桁幅を、
次のように調整します。なお、以降で、k は、文字列 S の桁数です。
w > k の時、全桁幅が w で、S を右詰めした文字列を返します。
-w > k の時、全桁幅が -w で、S を左詰めした文字列を返します。
-k <= w <= k または、w が省略/不正の時、S をそのまま返します。
なお、S を右詰め/左詰めする際、残りの桁は半角空白で埋められます。
w > 32 の時、w = 32 として扱います。
注意: f 型実数表記では、例えば、1e+80'f のような場合、80 字以上のかなり長い
文字列になります。
T が数値以外の場合、null を返します。
用例:
#set q quote
print ::Math.sqrt(2)'f(8) '#q; // → "1.41421356"
print ::Math.arctan(-1,0)'f'#q; // → "3.141593"
print 12.345'f(0) '#q; // → "12"
print 12.345'f(1) '#q; // → "12.3"
print 12.345'f(2) '#q; // → "12.35"
print -1.23456789e+20'f '#q; // → "-123456789000000000000.000000"
print +123.45678'f '#q; // → "123.456780"
print +123.45678'f(-1) '#q; // → "+123.5"
print +123.45678'f(-4,15) '#q; // → " +123.4568"
print +123.45678'f(-4,-15) '#q; // → "+123.4568 "
print -123.45678'f '#q; // → "-123.456780"
print -123.45678'f(-1) '#q; // → "-123.5"
print -123.45678'f(-4,15) '#q; // → " -123.4568"
print -123.45678'f(-4,-15) '#q; // → "-123.4568 "
print "ABC"'f; // → <null>
T'e( n, w ) → e 型実数表記文字列
機能: 対象 T の数値を e 型実数表記文字列に変換します
説明: e 型実数表記は、#.###e+### の形式で実数値を表わします。
ここでは、仮数部の #.### と、指数部の e+### があります。
仮数部に、+/- の符号がある時は、この先頭に付きます。
仮数部の小数点以上の桁は、必ず1桁になります。
仮数部の小数点以下の桁は、引数 n で指定します。
指数部は、e の次の + か - の符号が付いた 10進 3桁の数字列です。
引数 n は、仮数部の小数点以下何桁まで出力するかを指定します。
n が省略/不正の時、n = 6 として扱います。
n は 32 を超えても 32 として扱います。
n = 0 の時、小数点とそれ以下の桁は表記されません。
n の指定で切り取られる桁は、四捨五入されます。
n < 0 の時、T が正なら、先頭に +(プラス)符号が付きます。
さらに、n = -n として、上記のように扱います。
T が負なら、先頭に -(マイナス)符号が付きます。
引数 w は、このように変換された文字列(以降 S と呼びます)の全桁幅を、
次のように調整します。なお、以降で、k は、文字列 S の桁数です。
w > k の時、全桁幅が w で、S を右詰めした文字列を返します。
-w > k の時、全桁幅が -w で、S を左詰めした文字列を返します。
-k <= w <= k または、w が省略/不正の時、S をそのまま返します。
なお、S を右詰め/左詰めする際、残りの桁は半角空白で埋められます。
w > 32 の時、w = 32 として扱います。
注意: T が数値以外の場合、null を返します。
用例:
#set q quote
print +123.45678'e '#q; // → "1.234568e+002"
print +123.45678'e(3) '#q; // → "1.235e+002"
print +123.45678'e(-1) '#q; // → "+1.2e+002"
print +123.45678'e(-4,15) '#q; // → " +1.2346e+002"
print +123.45678'e(-4,-15) '#q; // → "+1.2346e+002 "
print -123.45678'e '#q; // → "-1.234568e+002"
print -123.45678'e(3) '#q; // → "-1.235e+002"
print -123.45678'e(-1) '#q; // → "-1.2e+002"
print -123.45678'e(-4,15) '#q; // → " -1.2346e+002"
print -123.45678'e(-4,-15) '#q; // → "-1.2346e+002 "
print ::Math.arctan(-1,0)'e'#q; // → 3.141593e+000
print "ABC"'e; // → <null>
T'g( n, w ) → g 型実数表記文字列
機能: 対象 T の数値を g 型実数表記文字列に変換します
説明: 引数 n は、有効桁数を指定します。
g 型実数表記は、概ね、f 型実数表記と e 型実数表記の短い方になります。
厳密には、e 型実数表記になるのは、その指数が -5 以下か、n 以上の場合です。
それ以外の場合には、f 型実数表記になります。
但し、g 型実数表記では、小数点以下の末尾桁の 0 は除かれます。また、
小数点以下の全桁が 0 の場合、小数点は付加されません。
n で指定される有効桁数には、負号 - と小数点 . は含まれません。
有効桁から外れる桁は四捨五入されます。
T が正数の時、+ 符号を付けた表記にするには、n の値を負にします。
その際、その絶対値が、有効桁数の指定として扱われます。
引数 w は、このように変換された文字列(以降 S と呼びます)の全桁幅を、
次のように調整します。なお、以降で、k は、文字列 S の桁数です。
w > k の時、全桁幅が w で、S を右詰めした文字列を返します。
-w > k の時、全桁幅が -w で、S を左詰めした文字列を返します。
-k <= w <= k または、w が省略/不正の時、S をそのまま返します。
なお、S を右詰め/左詰めする際、残りの桁は半角空白で埋められます。
w > 32 の時、w = 32 として扱います。
注意: T が数値以外の場合、null を返します。
用例:
#set q quote
print +123.45678'g '#q; // → "123.457"
print +123.45678'g(-4,15) '#q; // → " +123.5"
print +123.45678'g(-4,-15)'#q; // → "+123.5 "
print -123.45678'g '#q; // → "-123.457"
print -123.45678'g(-4,15) '#q; // → " -123.5"
print -123.45678'g(-4,-15)'#q; // → "-123.5 "
print 0.00012345'g '#q; // → "0.00012345"
print 0.000012345'g '#q; // → "1.2345e-005"
print 1.2345'g(2) '#q; // → "1.2"
print 12.345'g(2) '#q; // → "12"
print 123.45'g(2) '#q; // → "1.2e+002"
print "ABC"'g; // → <null>
T'c → 文字列
機能: 対象の文字コード T を文字列に変換します
説明: 対象の整数値を文字コードとする文字列を返します。
対象の整数値内には、1〜4 バイトの文字コードが格納できます。
用例:
print `A`'c; // → A
print `ABCD`'c; // → ABCD
print `あい`'c; // → あい
S = "";
for( c = `A` ; c <= `Z` ; c++ )
S += c'c;
print S; // → ABCDEFGHIJKLMNOPQRSTUVWXYZ
●書式変換
T'fmt( 引数並び ) → 文字列
機能: 対象の文字列 T の書式に基づいて引数並びを変換した文字列を返します
説明: 対象の文字列 T 内には、通常文字列部と書式規定部が混在します。
通常文字列部は、そのまま出力します。一方、
書式規定部は、対応する引数を、その書式に応じた文字列に変換して出力します。
ここで、出力というのは、本関数が返す文字列に含めるということです。
書式規定部は、必ず、% で始まり、特定のアルファベット1字で終ります。
例えば、"A=%d,B=%08X;" では、通常文字列部は、"A=", ",B=", ";" の3箇所で、
書式規定部は、"%d", "%08X" の2箇所になります。
書式規定部の最後の1字は重要で、対応する引数のデータ型(とその扱い方)と
その変換文字列の書式を決定します。以下に、その一覧を示します。なお、この
表内の各変換文字列の書式については、前節で述べています。また、最後の1字
にはここに挙げた以外にも、C n p S がありますが、本言語では、使用禁止です。
|
字 |
引数データ型 |
変換文字列の書式 |
| d |
整数(符号あり) | 10進文字列 |
| i |
(同上) | (同上) |
| u |
整数(符号なし) | 10進文字列 |
| o |
整数(符号なし) | 8進文字列 |
| X |
整数(符号なし) | 16進文字列( 10以上の数字は A〜F ) |
| x |
整数(符号なし) | 16進文字列( 10以上の数字は a〜f ) |
| c |
整数(文字コード) | 文字(半角のみ有効) |
| e |
浮動小数点数 | e 型実数表記文字列(指数は e ) |
| E |
浮動小数点数 | e 型実数表記文字列(指数は E ) |
| f |
浮動小数点数 | f 型実数表記文字列 |
| g |
浮動小数点数 | g 型実数表記文字列(指数は e ) |
| G |
浮動小数点数 | g 型実数表記文字列(指数は E ) |
| s |
文字列 | 引数の文字列そのもの |
書式規定部の最初の % と最後の1字の間には、下記の指定をこの順で入れる
ことができます。また、これらの各指定は、個々に省略することもできます。
省略時には、そのデフォールトの仕様が適用されます。
・フラグ
次の1字で各仕様を規定します。
- 変換文字列をフィールド内に左詰で配置します。
+ 数値変換文字列の先頭に必ず + - の符号を付けます。
0 数値変換文字列の左側の余桁を 0 で埋めます。
空白 数値変換文字列の先頭が符号でなければ空白を前置します。
# 次の各書式変換方式の場合の仕様を規定します。
o x X: 数値が 0 でなければ、その変換文字列の前に、
それぞれ、0, 0x, 0X を付けます。
e E f: その変換文字列内に必ず小数点を含めます。
g G: その変換文字列内に必ず小数点を含め、
末尾の 0 を除去しません。
この各デフォールト仕様は、それぞれ、右詰、負値のみ符号付加、
空白で埋める、空白前置なし、各通常の変換文字列、になります。
・フィールド幅
変換文字列を納めるフィールドの幅の字数(半角単位)を指定します。
この幅が、変換文字列よりも長い場合、
変換文字列は、右詰されます。
但し、前記フラグで - 指定が有効な時は、左詰されます。
余った空間は、空白で埋められます。
但し、前記フラグで 0 指定が有効な時は、0 で埋められます。
この幅が、変換文字列よりも短いか等しい場合、
変換文字列は、そのまま出力されます。
この幅での切り取りは行なわれません。
この幅の指定は、その字数を表わす10進整数の数字列か、または、
* 1字にします。* の場合、それに対応する引数の値が、その字数として
使われます。なお、この引数は整数型でなければいけません。
・精度
次の各書式変換方式の場合に応じて、各仕様を規定します。
d i u o x X:
整数値→文字列変換での最少限の桁数を規定します。つまり、
精度の桁数が、この変換での実質桁数よりも多い場合に限り、
この桁数差分の上位桁に 0 が補填されます。
デフォールトは、1 です。
e E f:
小数点以下の有効桁数を規定します。
この有効桁内には、四捨五入して納められます。
精度=0 の場合、整数部だけになり、小数点も付きません。
デフォールトは、6 です。
g G:
有効桁数を規定します。
この有効桁内には、四捨五入して納められます。
デフォールトは、6 です。
s:
対応する引数の文字列の最大字数(半角単位)を規定します。
この字数がその文字列より長い場合、その末尾部が切り取られます。
この字数がその文字列より短いか同じ場合、そのままになります。
デフォールトは、その文字列の全字数(半角単位)です。
c:
この場合の精度は無効です。
この精度を指定する場合、ピリオド(.)に続けて、
その桁数を表わす10進整数の数字列か、または、
* 1字にします。* の場合、それに対応する引数の値が、その桁数に
なります。なお、この引数は整数型でなければいけません。
・サイズ
h l L のどれかの1字で引数のサイズを規定しますが、
本言語では、現状、特別な効果はありません。
なお、% 以降の文字列が、上述の書式規定部の表記形態に合致しない場合には、
その最初の % から合致しないことが発覚する直前までの部分は無視されます。
合致しないことを発覚させた文字自身はそのまま出力されます。それ以降は、
通常通りの扱いになります。従って、%% は、% 自身の出力になります。
対象文字列 T 内の各書式規定部は、その出現順に、引数並び内の各引数に対応
します。ただし、書式規定部内でフィールド幅や精度の指定が * の場合には、
それに対応する引数が、その書式規定部に対応する引数の直前に介在します。
書式規定部と引数の対応に不整合がある場合、例えば、その個数に過不足がある
場合や、データ型が合わない場合、本関数は、null 返すか、または、無意味な
文字列を返すことになります。
注意: 現状、引数は、最大 32 個まで可能です。また、本関数が返す文字列のサイズは、
最大 8192 バイトまでになります。
用例:
v = 123;
print "|%d|%d|"'fmt( v, -v ); // → |123|-123|
print "|%8d|%8d|"'fmt( v, -v ); // → | 123| -123|
print "|%-8d|%-8d|"'fmt( v, -v ); // → |123 |-123 |
print "|%8.5d|%8.5d|"'fmt( v, -v ); // → | 00123| -00123|
print "|%-8.2d|%-8.2d|"'fmt( v, -v ); // → |123 |-123 |
print "|%*.4d|%-*.*d|"
'fmt( 8, v, 8, 4, -v ); // → | 0123|-0123 |
v = 456;
print "|%i|%i|"'fmt( v, -v ); // → |456|-456|
print "|%u|%u|"'fmt( v, -v ); // → |456|4294966840|
v = 0x3AB;
print "|%X|%x|"'fmt( v, v ); // → |3AB|3ab|
print "|%8X|%08x|"'fmt( v, v ); // → | 3AB|000003ab|
print "|%#8X|%#08x|"'fmt( v, v ); // → | 0X3AB|0x0003ab|
print "|%-#8.4X|%-#08.4x|"'fmt( v, v ); // → |0X03AB |0x03ab |
v = 12.345;
print "|%f|%e|"'fmt( v, v ); // → |12.345000|1.234500e+001|
print "|%8.2f|%12.2E|"'fmt( -v, -v ); // → | -12.35| -1.23E+001|
print "|%-8.1f|%-12.1E|"'fmt( v, v ); // → |12.3 |1.2E+001 |
v = 12.3456789;
print "|%g|%G|"'fmt( v, -v*1e10 ); // → |12.3457|-1.23457E+011|
print "|%.4g|%.4g|"'fmt( v, -v ); // → |12.35|-12.35|
print "|%-10.3g|%-10.3g|"'fmt( v, -v ); // → |12.3 |-12.3 |
print "|%s|"'fmt( "ABCxyz" ); // → |ABCxyz|
print "|%10s|"'fmt( "ABCxyz" ); // → | ABCxyz|
print "|%-10s|"'fmt( "ABCxyz" ); // → |ABCxyz |
print "|%10.5s|"'fmt( "ABCxyz" ); // → | ABCxy|
print "|%-10.4s|"'fmt( "ABCxyz" ); // → |ABCx |
print "|%c|%c|%c|"'fmt( `A`,`ア`,`あ` ); // → |A|ア||
print "|%%%s%-45.6^|"'fmt( "ABC" ); // → |%ABC^|
●部分抽出/整形/反復/変位/補修
T'part( i, n, r ) → 部分抽出文字列 or 部分置換文字列
機能: 対象の文字列 T 内の ( i, n ) 部分を抽出して返すか、または、
対象の文字列 T 内の ( i, n ) 部分を文字列 r に置換した文字列を返します。
説明: i は、対象文字列内の部分文字列の先頭までの字数を指定します。
i >= 0: 対象文字列の先頭から順方向への字数
i < 0: 対象文字列の末尾から逆方向への字数
i が省略/不正時、i = 0 として扱われます
n は、部分文字列の字数または範囲を指定します。
n >= 0: 部分文字列の字数
n < 0: 対象文字列の末尾まで(この場合、負数の値は任意です)
n が省略/不正時、n = 1 として扱われます
r が省略、または、文字列でない時、
対象文字列内の (i,n) の部分文字列を返します
r が文字列の時、
対象文字列内の (i,n) の部分文字列を r に置換した文字列を返します
注意: i と n の単位は、バイト数ではなく、字数になります。
従って、全角でも半角でも1字にカウントします。
(i,n) の指定が、対象文字列 T の範囲外に及ぶ場合、
その部分は対象外になります。
用例:
print "ABCDEFGH"'part(2,3); // → CDE
print "ABCDEFGH"'part(2,-1); // → CDEFGH
print "ABCDEFGH"'part(2); // → C
print "ABCDEFGH"'part(-4,3); // → EFG
print "ABCDEFGH"'part(-4,-1); // → EFGH
print "ABCDEFGH"'part(-4); // → E
print "ABCDEFGH"'part(,3); // → ABC
print "あいうえお"'part(-3,2); // → うえ
print "あイウエお"'part(2,3); // → ウエお
print "ABCDEFGH"'part(3,2,"xyz"); // → ABCxyzFGH
print "あいうえお"'part(2,-1,"ABC"); // → あいABC
T's( w, k ) → 桁幅内配置調整文字列
機能: 対象の文字列 T の桁幅(フィールド)内の配置を調整した文字列を返します
説明: w の絶対値は全幅の桁数で、w が負なら左詰、正なら右詰になります。
w が省略/不正時、対象の文字列の幅が全幅になります。
w の絶対値が 1024 を超えても、1024 として扱われます。
k は、w で決まる桁幅内に配置される対象文字列をシフトする桁数になります。
k が負で左シフト、正で右シフト、0でセンターになります。
k が省略/不正時、シフトは行なわれません。
桁幅内の余白は半角空白で埋められます。
全角コードが桁幅の境界で分断されるとその片割れは半角空白に変更されます。
用例:
print ":" + "ABC"'s(7) + ":"; // → : ABC:
print ":" + "ABC"'s(7,+1) + ":"; // → : AB:
print ":" + "ABC"'s(7,-1) + ":"; // → : ABC :
print ":" + "ABC"'s(-7) + ":"; // → :ABC :
print ":" + "ABC"'s(-7,+1) + ":"; // → : ABC :
print ":" + "ABC"'s(-7,-1) + ":"; // → :BC :
print ":" + "ABC"'s(7,0) + ":"; // → : ABC :
print ":" + "ABCDE"'s(3) + ":"; // → :CDE:
print ":" + "ABCDE"'s(-3) + ":"; // → :ABC:
print ":" + "イロハ"'s(9) + ":"; // → : イロハ:
print ":" + "イロハ"'s(9,+1) + ":"; // → : イロ :
print ":" + "イロハ"'s(9,0) + ":"; // → : イロハ :
T'trim( e, s ) → 左右端空白除去文字列
機能: 対象の文字列 T を 左右端の空白を除去した文字列を返します
説明: e は、左右のどちらの端の空白を除去するかを指定します。
e = 0: 両端, e < 0: 左端のみ, e > 0: 右端のみ
e が省略/不正で、両端
s は、除外対象の空白コードの文字列を指定します。
s が省略/不正で、次の空白コードが除外対象になります。
ASCII の SP, HT, VT, FF, CR, LF と、全角空白
s には、空白だけでなく、任意の文字を指定できます。
用例:
print ":" + " ABC XYZ "'trim + ":"; // → :ABC XYZ:
print ":" + " ABC XYZ "'trim(-1) + ":"; // → :ABC XYZ :
print ":" + " ABC XYZ\n"'trim(+1) + ":"; // → : ABC XYZ:
print ":" + " ABC \r\n"'trim(+1,"\r\n") + ":"; // → : ABC :
print ":" + "「ABC」"'trim(,"「」") + ":"; // → :ABC:
T'rep( n ) → 反復文字列
機能: 対象の文字列 T を n 回反復した文字列を返します
説明: n の値に応じて、次のようになります。
n > 0: 対象の文字列を n 回反復した文字列を返します
n = 0: 空文字列を返します
n < 0: null を返します
n が省略/不正で、n = 1 として扱います
用例:
print "ABC"'rep(3); // → ABCABCABC
T'shift( n ) → シフト文字列
機能: 対象の文字列 T を n 字シフトした文字列を返します。
説明: n は、シフトの方向と字数を規定します。
n > 0: 右シフトの字数
n < 0: 左シフトの字数(絶対値)
n の単位は、字数なので、全角でも半角でも1字にカウントします。
シフトによって端から溢れた文字は消失します。そのため、
文字列の右 n 字シフトは、末尾の n 字の除去になります。
文字列の左 n 字シフトは、先頭の n 字の除去になります。
n が省略/不正で、n = 1 として扱います。
n = 0 の時は、対象の文字列 T をそのまま返します。
補説: 対象 T が整数値の時、⇒参照
エラーの時、null を返します。
用例:
print "ABCあいう"'shift(-3); // → あいう
print "ABCあいう"'shift(+4); // → AB
T'rotate( n ) → 回転文字列
機能: 対象の文字列 T を n 字回転した文字列を返します。
説明: n は、回転の方向と字数を規定します。
n > 0: 右回転の字数
n < 0: 左回転の字数(絶対値)
n の単位は、字数なので、全角でも半角でも1字にカウントします。
n が省略/不正で、n = 1 として扱います。
n = 0 または、n が対象文字列の字数以上の時、対象文字列をそのまま返します。
補説: 対象 T が整数値の時、⇒参照
対象 T が複合箱の時、⇒参照
エラーの時、null を返します。
用例:
print "ABCあいう"'rotate(-3); // → あいうABC
print "ABCあいう"'rotate(+4); // → CあいうAB
T'reverse → 逆順文字列
機能: 対象の文字列 T の各文字の並びを逆順にした文字列を返します。
補説: 対象 T が整数値の時、⇒参照
対象 T が複合箱の時、⇒参照
対象 T がメモリーブロックの時、⇒参照
エラーの時、null を返します。
用例:
print "ABCあいう"'reverse; // → ういあCBA
T'mend(r,c,s,x) → 補修文字列
機能: 対象の文字列 T 内の不正/0値/制御コードを代替文字で補修して返します。
説明: r は、不正文字コードを代替する半角文字コードを指定します。
r の指定は、文字列ではなく、文字コードにしないといけません。
r が省略/不正の時、`?` が代替文字コードになります。
r = 0 の場合、不正文字コードを除去します。
c は、制御コード( 0x00〜0x1F, 0x7F )の代替文字コード列を指定します。
c の文字列内の各文字を順に、c[i] ( i = 0,1,2,... ) とすると、
c[0] 〜 c[31] は、制御コード 0x00 〜 0x1F の代替文字コードで、
c[32] は、0x7F(DEL) の代替文字コードになります。
c[i] が無い、つまり、c の文字列の長さが i 以下の時、
それに対応する制御コードは、そのまま存続します。
但し、0x00 だけは、半角空白に代替されます。
c[i] が引数 s で指定された文字コードと等しい時、
c[i] が無い時と同じです。
c[i] が引数 x で指定された文字コードと等しい時、
それに対応する制御コードは、除去されます。
s は、上記の意味の文字コードを指定します。
s が省略/不正の時、`+` が指定されたものとして扱います。
x は、上記の意味の文字コードを指定します。
x が省略/不正の時、`-` が指定されたものとして扱います。
例1:
text'UBYTE(6+32+1+2+4) = // 制御コード等を含む文字列の純粋配列
{
`S`,`T`,`A`,`R`,`T`,`-`,
0, 1, 2, 3, 4, 5, 6, 7, // NUL,^A,^B,^C,^D,^E,^F,BEL
8, 9,10,11,12,13,14,15, // BS,HT,LF,VT,FF,CR,SO,SI
16,17,18,19,20,21,22,23, // ^P,^Q,^R,^S,^T,^U,^V,^W
24,25,26,27,28,29,30,31, // ^X,^Y,^Z,ESC,....
0x7F, // DEL
0x81, 0x32, // 不正コード
`-`,`E`,`N`,`D`,
};
print text'gets'mend( 0, "@abcdefghijklmnopqrstuvwxyz[\\]^_!" );
print text'gets'mend( , "-a-c-e-g-i-k-m-o-q-s-u-w-y-[-]-_-" );
これを実行すると、次の通りプリントされます。
START-@abcdefghijklmnopqrstuvwxyz[\]^_!??-END
START-acegikmoqsuwy[]_-END
例2:
// バイナリーファイルの内容を 16進値でダンプする
file = ::File.Open( "xxx.bin", "in" );
if( file == null )
'Error!( "ファイルが開けません!\n" );
Bytes'UBYTE(16);
for( offset = 0 ;; offset += 16 )
{
bn = file.Read( Bytes );
if( bn <= 0 )
break;
line = offset'x(6) + " ";
for( i = 0 ; i < bn ; i++ )
line += Bytes(i)'x(2) + " ";
if( bn < 16 )
line += " "'rep( 16 - bn );
line += " " + Bytes'gets( bn )
'mend( , "_.........・..・..................." );
print line;
}
file.Close();
●バイト数/字数/コード/字種の取得
T'cn( n ) → 文字列のバイト数
機能: 対象の文字列 T の先頭または末尾から n 字のバイト数を返します
説明: n >= 0: 先頭からの字数
n < 0 : 末尾からの字数(絶対値)
n が省略/不正で、対象文字列の全字が対象
用例:
T = "ABCあいう";
print T'cn;
for( i = 0 ; i <= 6 ; i++ )
print T'cn( i ), -;
print;
for( i = 0 ; i <= 6 ; i++ )
print T'cn( -i ), -;
print;
実行結果:
9
0, 1, 2, 3, 5, 7, 9,
0, 2, 4, 6, 7, 8, 9,
T'kn( n ) → 文字列の字数
機能: 対象の文字列 T の先頭または末尾から n バイトの字数を返します
説明: n >= 0: 先頭からのバイト数
n < 0 : 末尾からのバイト数(絶対値)
n が省略/不正で、対象文字列の全字が対象
注意: n バイト目が全角片割れになる場合、その全角もカウントに含みます
用例:
T = "ABCあいう";
print T'kn;
cn = T'cn;
for( i = 0 ; i <= cn ; i++ )
print T'kn( i ), -;
print;
for( i = cn ; i >= 0 ; i-- )
print T'kn( -i ), -;
print;
実行結果:
6
0, 1, 2, 3, 4, 4, 5, 5, 6, 6,
0, 1, 1, 2, 2, 3, 3, 4, 5, 6,
T'chcode(i) → 文字コード値
機能: 対象の文字列の先頭または末尾から第 i 位の文字の文字コード値を返します
説明: i = 0, 1, 2, ... で、先頭から、第1字目、第2字目、第3字目、・・・
i = -1,-2,-3, ... で、末尾から、第1字目、第2字目、第3字目、・・・
i が省略/不正で、i = 0
注意: 第 i 位が、対象の文字列外の場合、0 を返します。
用例:
T = "ABCあいう";
print T'chcode;
for( i = 0 ; i <= 6 ; i++ )
print "0x" + T'chcode(i)'x(4), -;
print ;
for( i = 1 ; i <= 7 ; i++ )
print "0x" + T'chcode(-i)'x(4), -;
print ;
実行結果:
65
0x0041, 0x0042, 0x0043, 0x82A0, 0x82A2, 0x82A4, 0x0000,
0x82A4, 0x82A2, 0x82A0, 0x0043, 0x0042, 0x0041, 0x0000,
T'chtype → 文字種別
機能: 対象の文字コードの文字種別を示す整数値を返します
説明: 文字種別を示す整数値の各ビットは、次の意味があります。
Bit-0 : 制御コード( ASCII コード値が 0x00〜0x1F )
Bit-1 : 空白( ASCII の SP, HT, VT, FF, VT, CR, LF )
Bit-2 : 英大文字( A〜Z )
Bit-3 : 英小文字( a〜z )
Bit-4 : 数字( 0〜9 )
Bit-5〜11: (未定義)
Bit-12: カタカナ(半角)
Bit-13〜15: (未定義)
Bit-16: ひらかな
Bit-17: カタカナ(全角)
Bit-18: 漢字
Bit-19: (未定義)
Bit-20: JIS 第1水準
Bit-21: JIS 第2水準以上
Bit-22: 全角
Bit-23〜31: (未定義)
各種別は、各対応ビットが 1 の時に有効で、0 の時に無効になります。
補説: 文字種別の確認用のマクロを、次のように定義して使用することもできます。
#set IsSpace( c ) ( #c'chtype & 0x0002 )
#set IsUpper( c ) ( #c'chtype & 0x0004 )
#set IsLower( c ) ( #c'chtype & 0x0008 )
#set IsDigit( c ) ( #c'chtype & 0x0010 )
#set IsHirakana( c ) ( #c'chtype & 0x010000 )
#set IsKatakana( c ) ( #c'chtype & 0x021000 )
#set IsKanji( c ) ( #c'chtype & 0x040000 )
#set IsZenkaku( c ) ( #c'chtype & 0x400000 )
次の例では、このマクロを使用しています。
用例:
T = "Aa1 アあア亜\n";
kn = T'kn;
for( i = 0 ; i < kn ; i++ )
print ( #IsUpper( T'chcode(i) ) ? 1 : 0 ), -;
print ;
for( i = 0 ; i < kn ; i++ )
print ( #IsKatakana( T'chcode(i) ) ? 1 : 0 ), -;
print ;
for( i = 0 ; i < kn ; i++ )
print ( #IsZenkaku( T'chcode(i) ) ? 1 : 0 ), -;
print ;
#set CHTYPE_MASK 0b11`1111`0001`0000`0001`1111
for( i = 0 ; i < kn ; i++ )
print "0x" + ( T'chcode(i)'chtype & #CHTYPE_MASK )'x(2), -;
print ;
実行結果:
1, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1, 0, 0,
0, 0, 0, 0, 0, 1, 1, 1, 0,
0x04, 0x08, 0x10, 0x02, 0x1000, 0x110000, 0x120000, 0x140000, 0x01,
●字種の変換
T'upper → 英字小→大変換文字列
機能: 対象の文字列 T 内の英小文字を英大文字に変換した文字列を返します
説明: 対象文字列内の英小字文字以外の文字はそのままです。
全角の英小字文字も、全角の英大文字に変換されます。
用例:
print "abcXYZ"'upper; // → ABCXYZ
print "ABCxyz"'upper; // → ABCXYZ
T'lower → 英字大→小変換文字列
機能: 対象の文字列 T 内の英大文字を英小文字に変換した文字列を返します
説明: 対象文字列内の英大字文字以外の文字はそのままです。
全角の英大字文字も、全角の英小文字に変換されます。
用例:
print "abcXYZ"'lower; // → abcxyz
print "ABCxyz"'lower; // → abcxyz
T'capit → 英頭文字小→大変換文字列
機能: 対象の文字列 T の頭文字のみを大文字化した文字列を返します
説明: 対象文字列の先頭の ASCII 又は全角の英小文字を英大文字に変換し、
残りの文字列中の ASCII 又は全角の英大文字を英小文字に変換します。
英字以外の文字はそのままです。
用例:
print "abcXYZ"'capit; // → Abcxyz
print "ABCxyz"'capit; // → Abcxyz
T'toZenk → 半角→全角変換文字列
機能: 対象の文字列 T 内の半角文字を全角文字に変換した文字列を返します
説明: 半角カタカナの濁点/半濁点は、
正当なら、その左側の半角カタカナと統合して1つの全角カタカナになります。
不当なら、各単独で全角になります。
全角文字はそのままです。
用例:
print "ABCxyz123"'toZenk; // → ABCxyz123
print "ハンカク→全角"'toZenk; // → ハンカク→全角
print "プログラム"'toZenk; // → プログラム
print "\\~ア゚イ゙"'toZenk; // → ¥〜ア゜イ゛
T'toHank → 全角→半角変換文字列
機能: 対象の文字列 T 内の全角文字を半角文字に変換した文字列を返します
説明: 半角文字に変換できない全角文字(ひらかな・漢字等)はそのままです。
濁点/半濁点付きの全角カタカナは、半角カタカナ2字になります。
半角文字はそのままです。
注意: 全角の ¥ は、半角の \ になりますが、全角の \ は半角には変換されません。
これは、Shift-JIS の文字セットには、半角のバックスラッシュがないためです。
用例:
print "ABCxyz123"'toHank; // → ABCxyz123
print "ゼンカク→ハンカク"'toHank; // → ゼンカク→ハンカク
print "プログラム"'toHank; // → プログラム
print "¥〜\ア゜イ゛"'toHank; // → \~\ア゚イ゙
T'toHira → カタカナ→ひらかな変換文字列
機能: 対象の文字列 T 内の全角カタカナを全角ひらかなに変換した文字列を返します
説明: 全角カタカナ以外の文字はそのままです。
但し、全角カタカナの「ヴヵヶ」は、対応するひらかながないのでそのままです。
半角カタカナを全角ひらかなに変換するには、
半角カタカナを全角カタカナに変換しておいてから変換する必要があります。
用例:
print "アイウエオ"'toHira; // → あいうえお
print "ガギグゲゴ"'toHira; // → がぎぐげご
print "ヰヱヲンヴヵヶ"'toHira; // → ゐゑをんヴヵヶ
print "アイウエオ"'toZenk'toHira; // → あいうえお
print "To: ハル子"'toHira; // → To: はる子
T'toKata → ひらかな→カタカナ変換文字列
機能: 対象の文字列 T 内の全角ひらかなを全角カタカナに変換した文字列を返します
説明: 全角ひらかな以外の文字はそのままです。
用例:
print "あいうえお"'toKata; // → アイウエオ
print "がぎぐげご"'toKata; // → ガギグゲゴ
print "ゐゑをん"'toKata; // → ヰヱヲン
print "From: はる子"'toKata; // → From: ハル子
●比較
T'icmp( A ) → 英字大小区別なし比較結果
機能: 対象の文字列 T と文字列 A を英字大小区別なしで比較した結果を返します
説明: 両文字列内の各文字コードを先頭から順に比較していきます。
その際、半角の英大文字は英小文字に変換して比較します。
全角は2バイトの文字コードとして扱います。
この比較結果は、次の意味を持つ整数値として返します。
0: 両者は同じ, 負: 前者は後者より先順, 正: 前者は後者より後順
用例:
print "ABCxyz"'icmp( "abcXYZ" ); // → 0
print "_abc"'icmp( "ABC" ); // → -2
print "ABC"'icmp( "abc" ); // → -33
print "アイウ"'icmp( "あいう" ); // → 161
T'wcmp( A ) → ワイルドカード比較結果
機能: 対象の文字列 T と文字列 A をワイルドカードで比較した結果を返します
説明: ワイルドカードには次の2種類の文字があります。
* どの文字列とも一致します(空文字列とも一致)
? どの1字とも一致します (全角1字とも一致)
文字列 A 内に、ワイルドカード文字を含めることができます。
対象文字列 T 内に、ワイルドカード文字があっても通常文字として扱います。
半角の英大文字は英小文字に変換して比較します。
この比較の結果として、
両文字列が一致すれば、0 の整数値を返します。
両文字列が一致しなければ、0 以外の整数値を返します。
用例:
print "xyz.c"'wcmp( "*.c" ); // → 0
print "xyz.c"'wcmp( "*.h" ); // → 53
print "12345"'wcmp( "1?3?5" ); // → 0
print "ABCxyz"'wcmp( "A*xy?" ); // → 0
print "イロハ"'wcmp( "イロ?" ); // → 0
print "美しい"'wcmp( "*い" ); // → 0
print "花子"'wcmp( "??子" ); // → -36465
●正規表現による操作
T'match( r, m0, m1, m2, ... )
機能: 対象の文字列 T を正規表現 r と照合して一致した部分を
箱 m0, m1, m2, ... に格納します
引数: r : 照合パターンを規定する正規表現の文字列
m0: 正規表現全体と一致する文字列部を格納する箱
m1, m2 , ... : 正規表現内の第 1, 2, ... 番目の参照グループ( @(...) 部 )
のパターンに一致する文字列部を格納する箱
返値: 照合(検索)を実施した場合:
>= 0: 一致パターンの識別値( デフォールトは 0 )
= -1: 不一致
= -2: ユーザー要求による検索中断
= -3: 検索経路が多過ぎる
= -4: 致命的エラー
照合(検索)を実施しなかった場合:
= 正規表現の文法エラー識別ビット
エラーの場合:
= null
説明: 対象文字列 T の先頭から正規表現 r のパターンを検索して、最初に見つかった
ところで照合して、その正規表現パターン全体との一致部を、箱 m0 に格納し、
各部分パターンとの一致部を、箱 m1, m2 , ... に格納します。
この関数での検索は、最初に見つかるところまでで、それ以降は行ないません。
連続して検索を行なう場合は、Buffer クラスの関数を使います。
この関数は、また、正規表現の文法エラーを確認するのにも使います。その場合、
対象文字列 T を省略して、正規表現 r だけでコールします。この関数では、
対象文字列 T が省略/不正の場合、正規表現 r が有効なら、その設定(登録)
が行なわれるだけで、照合(検索)は実行されません。その場合、返値は、その
正規表現の文法エラーの内容を示す整数値になります。この値は各種文法エラー
を示すビットで構成されています。この詳細は、「正規表現」の章の
・正規表現の文法エラー識別ビット
の節で述べています。
この関数のこのような正規表現 r だけでのコールは、正規表現の事前設定を、
行なう場合にも使います。この事前設定をしておくと、それ以降、同じ正規表現
でこの関数をコールする場合に、正規表現 r の指定を省略できます。この場合、
前回の正規表現の解読結果が利用されるので、毎回新規に解読するよりも、若干
速くなります。この解読結果は、本節内の他の関数( 'split, 'field, 'subst )
と共通に保管されているので、これらのどの関数をコールする時にも共通に反映
されます。
補説: m0, m1, m2 , ... の箱は、
・本関数では新規生成しないので、既存の箱を指定する必要があります。
・省略/不正の場合、当該一致部の文字列は代入されません。
・当該一致部がない場合、空になります。
・対象文字列 T が箱でそれと同一の場合、その箱には代入されません。
r の正規表現が省略/不正の場合、
前回と同じ正規表現が使われます。これについては、既に述べた通りです。
なお、この場合に、対象文字列 T も省略/不正の場合は、前回の正規表現の
文法エラーの内容を示す整数値が返されます。
正規表現に文法エラーがあっても所定の方策で解釈されて、処理は継続されます。
本関数でエラーになるのは、致命的エラー(メモリー不足等)の場合です。
例1:
"--AAABBBCCC--"
'match( "@(A+)@(B+)@(C+)", x'new!, a'new!, b'new!, c'new! );
print x, a, b, c; // → AAABBBCCC, AAA, BBB, CCC
例2:
// 空白区切りの年月日の文字列から、各年月日を抽出する
" 1974 3 21 "'match( $"\s*@(\d+)\s+@(\d+)\s+@(\d+)",
date'new!, Y'new!, M'new!, D'new! );
print date, Y, M, D; // → 1974 3 21, 1974, 3, 21
print ##${Y}年${M}月${D}日##; // → 1974年3月21日
例3:
// 正規表現の文法エラー確認と事前設定
regex = $"*P\.\d+)";
if(( err_bits = 'match( regex )) != 0 )
print "正規表現「" : regex : "」に文法エラー " :
err_bits'b(10) : " があります!";
// 事前に設定された正規表現で照合
"-- P.123 --"'match( , m'new! );
print m;
実行結果:
正規表現「*P\.\d+)」に文法エラー 0000010001 があります!
P.123
T'split( r, f )
機能: 対象の文字列 T を正規表現 r をセパレータとして分割した各フィールドを
連想配列 f に順に格納します
引数: r : 区切りのパターンを規定する正規表現の文字列
f : 各フィールドの文字列を格納する連想配列の箱名
( 第 1, 2, ... のフィールドは、f[0], f[1], ... に格納されます )
返値: フィールド数
( エラー時は、null になります )
説明: 対象文字列 T の先頭から末尾まで、正規表現 r のパターンを検索していって、
対象文字列を、正規表現に一致する部分と一致しない部分に分けます。ここで、
正規表現に一致する部分が区切りで、一致しない部分がフィールドになります。
このようにして抽出された各フィールドの文字列は、連想配列 f[i] の各要素に
格納されます。なお、i = 0, 1, 2, .... の順で、各フィールドに対応します。
例えば、対象文字列が 「AAA,BBB,CCC」 で、正規表現パターンが 「,」 の場合は、
「AAA」, 「BBB」, 「CCC」 の3フィールドが抽出されて、これらの文字列はそれぞれ、
f[0], f[1], f[2] に格納されます。
補説: 連想配列 f の箱は、
・本関数では新規生成しないので、既存の箱を指定する必要があります。
・各フィールド文字列の格納直前に、空の「箱を入れる箱」に変更されます。
・省略/不正の場合、各フィールド部の文字列は格納されません。
・対象文字列 T が箱で、それと同一の場合には、エラーになります。
r の正規表現が省略/不正の場合、前回と同じ正規表現が使われます。この場合、
正規表現の解読処理が省かれるので、正規表現を新規に指定する場合よりも、
若干速くなります。なお、本節「正規表現による操作」内の各関数においては、
正規表現の解読結果が共通に保管されているので、その結果は、本節内のどの
関数にも共通に反映されます。
正規表現 r が空文字列と一致する時は、区切りがないのと同等に扱われます。
正規表現に文法エラーがあっても所定の方策で解釈されて、処理は継続されます。
対象文字列 T が省略/不正の時は、エラーになります。
本関数と後述の 'field 関数は、フィールドの格納の仕方が異なっていますが、
機能的にはよく似ています。
例1:
"AAA BBB \t CCC"'split( $"\s+", F'new! );
print F[0], F[1], F[2]; // → AAA, BBB, CCC
例2:
n = "XXX , YYY, \t ZZZ"'split( $"\s*,\s*", Field'new! );
for( i = 0 ; i < n ; i++ )
print Field[i];
実行結果:
XXX
YYY
ZZZ
T'field( r, f1, f2, ... , fn )
機能: 対象の文字列 T を正規表現 r を区切りとして各フィールドに分割して、
箱 f1, f2, ... , fn に格納します
引数: r : 区切りのパターンを規定する正規表現の文字列
f1, f2, ... , fn :
第 1, 2, ... , 最後 のフィールドの文字列を格納する箱
返値: 対象文字列内で検出した区切りパターンの数
( エラー時は、null になります )
説明: 対象文字列 T の先頭から末尾まで、正規表現 r のパターンを検索していきます。
すると、対象文字列は、正規表現に一致する部分と一致しない部分に分かれます。
そこで、正規表現に一致しない部分がフィールドになり、一致する部分が区切り
になります。例えば、対象文字列を 「AAA,BBB,CCC」 、正規表現パターンを 「,」
とすると、「AAA」, 「BBB」, 「CCC」 の3フィールドに分割されます。各フィールド
の文字列は、箱 f1, f2, ... , fn に順に格納されます。フィールドの数の方が
格納箱の数よりも少ない場合、余った箱は空になります。逆に、フィールドの数
の方が格納箱の数よりも多い場合、最後の箱に残りの全文字列が格納されます。
この文字列には区切りも含まれます。例えば、先程の例で、格納箱の数の違いに
によって、各箱に格納される文字列は、次のようになります。
f1 → f1 = 「AAA,BBB,CCC」
f1, f2 → f1 = 「AAA」, f2 = 「BBB,CCC」
f1, f2, f3 → f1 = 「AAA」, f2 = 「BBB」, f3 = 「CCC」
f1, f2, f3, f4 → f1 = 「AAA」, f2 = 「BBB」, f3 = 「CCC」, f4 = 空
補説: f1, f2, ... , fn の箱は、
・本関数では新規生成しないので、既存の箱を指定する必要があります。
・省略/不正の場合、当該フィールド部の文字列は代入されません。
・対象文字列 T が箱でそれと同一の場合、その箱には代入されません。
r の正規表現が省略/不正の場合、前回と同じ正規表現が使われます。この場合、
正規表現の解読処理が省かれるので、正規表現を新規に指定する場合よりも、
若干速くなります。なお、本節「正規表現による操作」内の各関数においては、
正規表現の解読結果が共通に保管されているので、その結果は、本節内のどの
関数にも共通に反映されます。
正規表現 r が空文字列と一致する時は、区切りがないのと同等に扱われます。
正規表現に文法エラーがあっても所定の方策で解釈されて、処理は継続されます。
対象文字列 T が省略/不正の時は、エラーになります。
本関数と前述の 'split 関数は、フィールドの格納の仕方が異なっていますが、
機能的にはよく似ています。
例1:
"AAA BBB \t CCC"'field( $"\s+", A'new!, B'new!, C'new!, D'new! );
print A, B, C, D; // → AAA, BBB, CCC, <null>
例2:
'match( $"\s*,\s*" ); // 事前に正規表現を設定しておく
S = "XXX , YYY, \t ZZZ";
F'new!;
while( ( T = S ) != null )
{
T'field( , F, S ); // 前回と同じ正規表現を使用
print F;
}
実行結果:
XXX
YYY
ZZZ
T'subst( r, s, n, a1, a2, a3 )
機能: 対象の文字列 T と正規表現 r が一致する部分を
文字列 s, 回数 n, 連想配列 a1, a2, a3 によって置換した文字列を返します
引数: r : 置換部分を規定する正規表現の文字列
s : 置換文字列
n : 置換回数
a1, a2, a3 : 部分一致文字列の変換用連想配列
なお、これらの引数はどれでも省略可能です。
返値: 置換後の文字列
( エラー時は、null になります )
説明: 対象文字列 T を検索して、正規表現 r のパターンと一致する部分を抽出します。
この一致部分を置換文字列 s と置き換えるわけですが、置換文字列そのものと
単純に置き換えるのではなく、置換文字列 s 内に、
@0 @1 @2 ... @9 \0 \1 \2 ... \9 @@ \\
という特別な表記があれば、これを下記のように変換してから、置き換えます。
@1, @2, ..., @9 は、それぞれ、
a1, a2, a3 のどの連想配列も省略されている場合:
正規表現内の第 1,2,...9 番目の @(...) のパターンと一致した文字列部に
変換します。
a1, a2, a3 のどれかの連想配列が指定されている場合:
正規表現内の第 1,2,...9 番目の @(...) のパターンと一致した文字列部を、
連想配列 a1, a2, a3 のインデックスとして想起される文字列に変換します。
その際、a1, a2, a3 の順に確認して、省略/不正や文字列が想起されない
ものは除外して、最初に想起される文字列を採用します。どの連想配列から
も有効な文字列が想起されない時は、どの連想配列も省略されている場合と
同様に、@(...) のパターンと一致した文字列部に変換します。
@0 は、
a1, a2, a3 のどの連想配列も省略されている場合:
正規表現全体のパターンと一致した文字列部に変換します。
a1, a2, a3 のどれかの連想配列が指定されている場合:
正規表現全体のパターンと一致した文字列部を、連想配列 a1, a2, a3 の
インデックスとして想起される文字列に変換します。なお、その際の処理は、
@1, @2, ..., @9 の場合と同様です。
\1, \2, ..., \9 は、それぞれ、連想配列とは無関係に、
正規表現内の第 1,2,...9 番目の @(...) のパターンと一致した文字列部に
変換します。
@@ は、@ に変換します。
\\ は、\ に変換します。
このような置換は、引数の n で指定された回数だけ行なわれます。
この置換回数 n が、
・省略/不正の時は、全ての一致部が置換されます。
・0 以下の場合は、置換不履行で、対象の文字列と同じ文字列を返えします。
置換文字列が、省略/不正の時は、空文字列との置換になるので、結局、
対象の文字列内の正規表現と一致する部分が除去されることになります。
補説: r の正規表現が省略/不正の場合、前回と同じ正規表現が使われます。この場合、
正規表現の解読処理が省かれるので、正規表現を新規に指定する場合よりも、
若干速くなります。なお、本節「正規表現による操作」内の各関数においては、
正規表現の解読結果が共通に保管されているので、その結果は、本節内のどの
関数にも共通に反映されます。
正規表現 r との一致部が空文字列の場合、置換はその回だけになります。
正規表現に文法エラーがあっても所定の方策で解釈されて、処理は継続されます。
対象文字列 T が省略/不正の時は、エラーになります。
例1:
print "ABC-ABC"'subst( "A", "a", 1 ); // → aBC-ABC
print "ABC-ABC"'subst( "A", "a" ); // → aBC-aBC
print "ABC-ABC"'subst( "@(A)@(B)@(C)", "@3@2@1" ); // → CBA-CBA
print " 1974 03 21 "'trim'subst( $"\s+", "/" ); // → 1974/03/21
例2:
// 並列置換: A → X, B → Y, C → Z
S["A"] = "X"; S["B"] = "Y"; S["C"] = "Z";
print "ABC-CBA"'subst( "@(A|B|C)", "@1", , S ); // → XYZ-ZYX
例3:
// 簡易ローマ字→かな置換(一部例示用)
K["a"] = "あ"; K["ka"] = "か"; K["sa"] = "さ";
K["i"] = "い"; K["ki"] = "き"; K["si"] = "し";
K["u"] = "う"; K["ku"] = "く"; K["su"] = "す";
K["e"] = "え"; K["ke"] = "け"; K["se"] = "せ";
K["o"] = "お"; K["ko"] = "こ"; K["so"] = "そ";
print "aiueo kakikukeko sasisuseso"
'subst( "@([ks]?[aiueo]))", "「@1」", , K );
実行結果:
「あ」「い」「う」「え」「お」 「か」「き」「く」「け」「こ」 「さ」「し」「す」「せ」「そ」
●囲い,CSV,SSV操作
T'quote( q, e ) → 引用符付加文字列
機能: 対象の文字列 T を指定の引用符( q, e )で囲った文字列を返します
説明: q は、引用符の文字コードを指定します。
q に指定できるのは、次のどれかか半角空白に限定されます。
! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
q が省略/不正の時は、二重引用符 `"` が使われます。
e は、エスケープ文字の文字コードを指定します。
e は、対象文字列 T 内に q と同じ文字があった場合、その前に付加されます。
e に指定できるのは、ASCII 文字に限定されます。
e が省略/不正の時は、円記号 \ が使われます。
用例:
print "abc"'quote; // → "abc"
print "abc\"xyz"'quote; // → "abc\"xyz"
print "abc'xyz"'quote( `'` ); // → 'abc\'xyz'
print "abc\"xyz"'quote( , `"` ); // → "abc""xyz"
T'dequote( q, e ) → 引用符除去文字列
機能: 対象の文字列 T から指定の引用符( q, e )を除去した文字列を返します
説明: q と e は、'quote の場合と同じです。
用例:
print ##"abc"##'dequote; // → abc
print ##"abc\"xyz"##'dequote; // → abc"xyz
print ##'abc\'xyz'##'dequote( `'` ); // → abc'xyz
print ##"abc""xyz"##'dequote( , `"` ); // → abc"xyz
T'csv → CSV文字列
機能: 対象 T をコンマ区切り値( CSV: Comma Separated Value )のフィールドに
なり得る文字列に変換して返します
説明: 対象が整数なら、その10進表記文字列を返します。
対象が浮動小数点数なら、その g 型実数表記文字列を返します。
対象が文字列の場合:
・その文字列内に、コンマ(,)、二重引用符(")、改行のどれかがあれば、
その文字列全体を二重引用符(")で囲って返します。但し、その際、
その文字列内の1個の二重引用符は、2個の二重引用符に置換します。
・その文字列内に、コンマ(,)、二重引用符(")、改行のどれもなければ、
その文字列自身をそのまま返します。
対象が数値でも文字列でもなければ、null を返します。
用例:
print 123'csv; // → 123
print -45.6'csv; // → -45.6
print "abc xyz"'csv; // → abc xyz
print "abc,xyz"'csv; // → "abc,xyz"
print ##"abc","xyz"##'csv; // → """abc"",""xyz"""
print ##"abc xyz##'csv; // → """abc xyz"
T'ssv → SSV文字列
機能: 対象 T を空白区切り値( SSV: Space Separated Value )のフィールドに
なり得る文字列に変換して返します
説明: 対象が整数なら、その10進表記文字列を返します。
対象が浮動小数点数なら、その g 型実数表記文字列を返します。
対象が文字列の場合:
・その文字列内に、半角空白、タブ、二重引用符(")、改行のどれかがあれば、
その文字列全体を二重引用符(")で囲って返します。但し、その際、
その文字列内の1個の二重引用符は、2個の二重引用符に置換します。
・その文字列内に、半角空白、タブ、二重引用符(")、改行のどれもなければ、
その文字列自身をそのまま返します。
対象が数値でも文字列でもなければ、null を返します。
用例:
print 123'ssv; // → 123
print -45.6'ssv; // → -45.6
print "abc,xyz"'ssv; // → abc,xyz
print "abc xyz"'ssv; // → "abc xyz"
print ##"abc" "xyz"##'ssv; // → """abc"" ""xyz"""
print ##"abc xyz##'ssv; // → """abc xyz"