$EXTRACT (ObjectScript)
構文
$EXTRACT(string,from,to)
$E(string,from,to)
SET $EXTRACT(string,from,to)=value
SET $E(string,from,to)=value
引数
引数 | 説明 |
---|---|
string | 部分文字列が識別されるターゲット文字列。string には、評価結果が引用符で囲んだ文字列または数値になる式を指定します。SET $EXTRACT 構文では、string は変数または多次元プロパティにする必要があります。 |
from | オプション — 対象の string 内の開始位置を指定します。文字は 1 からカウントされます。許可される値は、n (string の先頭からの文字カウントを指定する正の整数)、* (string の末尾文字の指定)、および *-n (string の末尾から逆向きの文字のオフセット整数カウント) です。SET $EXTRACT 構文は、*+n (string の末尾の先に追加する文字のオフセット整数カウント) もサポートします。to なしの from は、単一の文字を指定します。to ありの from は、文字の範囲を指定します。from が指定されていない場合、既定値は 1 です。 |
to | オプション — 文字の範囲の終了位置 (その文字を含む) を指定します。from と共に使用する必要があります。許可される値は、n (string の先頭からの文字カウントを指定する正の整数)、* (string の末尾文字の指定)、および *-n (string の末尾から逆向きの文字のオフセット整数カウント) です。SET $EXTRACT 構文は、*+n (string の末尾の先に追加する文字範囲の終了位置のオフセット整数カウント) もサポートします。 |
概要
$EXTRACT は、string の先頭または string の末尾からの文字カウントで、string 内の部分文字列を識別します。部分文字列には、1 文字または文字の範囲を指定できます。
$EXTRACT には以下の 2 つの使用方法があります。
-
string の部分文字列を返します。これには構文 $EXTRACT(string,from,to) が使用されます。
-
string の部分文字列を置換します。置換部分文字列は、元の部分文字列と同じ長さでも、長くても、短くてもかまいません。これには構文 SET $EXTRACT(string,from,to)=value が使用されます。
部分文字列を返す方法
$EXTRACT は string から文字位置により部分文字列を返します。この部分文字列の抽出の特性は、使用する引数によって決まります。
-
$EXTRACT(string) は、文字列の先頭文字を抽出します。
SET mystr="ABCD" WRITE $EXTRACT(mystr)
-
$EXTRACT(string,from) は、from で指定した位置の 1 文字を抽出します。from の値は、文字列の最初からカウントした整数、文字列の最後の文字を指定するアスタリスク、または、文字列の最後から逆方向にカウントして指定する負の整数を持つアスタリスクになります。
以下の例では、文字列 “ABCD” から 1 つの文字を抽出します。
SET mystr="ABCD" WRITE !,$EXTRACT(mystr,2) // "B" the 2nd character WRITE !,$EXTRACT(mystr,*) // "D" the last character WRITE !,$EXTRACT(mystr,*-2) // "B" the offset 2 characters from end WRITE !,$EXTRACT(mystr,*-0) // "D" the last character by 0 offset
-
$EXTRACT(string,from,to) は、from の位置から始まり to の位置で終了する文字列の範囲 (その位置の文字を含む) を抽出します。例えば、変数 var2 が文字列 “1234Alabama567” を含むときは、以下の $EXTRACT 関数は両方とも文字列 “Alabama” を返します。
SET var2="1234Alabama567" WRITE !,$EXTRACT(var2,5,11) WRITE !,$EXTRACT(var2,*-9,*-3)
引数
string
部分文字列が識別されるターゲット文字列。
部分文字列を返すために $EXTRACT を使用する場合、string は、引用符で囲まれた文字列リテラル、キャノニック形式の数値、変数、オブジェクト・プロパティ、または評価結果が文字列または数値になる有効な ObjectScrip 式にできます。ターゲット文字列として NULL 文字列 ("") を指定すると、$EXTRACT はその他の引数値に関係なく、常に NULL 文字列を返します。
1 つの部分文字列を置換するために、等号の左側で SET と共に $EXTRACT を使用する場合、string は変数名または 多次元プロパティ参照にすることができますが、非多次元オブジェクト・プロパティにすることはできません。
from
from 引数は、単独の文字または文字の範囲の先頭を指定できます。
-
from が n (正の整数) の場合、$EXTRACT は string の先頭から文字をカウントします。
-
from が * (アスタリスク) の場合、$EXTRACT は string 内の末尾の文字を返します。
-
from が *-n (アスタリスクとそれに続く負の整数) の場合、$EXTRACT は string の末尾からオフセット分だけ文字をカウントします。つまり、*-0 は string 内の末尾の文字になり、*-1 は string 内の最後から 2 番目の文字 (末尾からのオフセットが 1) になります。
-
SET $EXTRACT 構文のみ — from が *+n (アスタリスクとそれに続く正の整数) の場合、SET $EXTRACT は string の末尾の先にオフセット分の文字を追加します。つまり、*+1 の場合は string の末尾の先に 1 つの文字が追加され、*+2 の場合は string の末尾の 2 つ先の位置に 1 つの文字が追加されます (末尾と追加位置の間には空白スペースが埋め込まれます)。*+0 は string 内の最後の文字です。
from の整数値が文字列内の文字数よりも大きいときは、$EXTRACT は NULL 文字列を返します。from に *-n 値を指定したときに、n が文字列の文字数以上になる場合、$EXTRACT は NULL 文字列を返します。from の値が 0 または負の数の場合、$EXTRACT は NULL 文字列を返します。ただし、from が to と共に使用されていると、0 または負の数になる from の値は、値 1 と見なされます。
from を to 引数と共に使用するときは、from は抽出する範囲の先頭を識別します。また、to の値よりも小さくなくてはなりません。from が to と等しい場合、$EXTRACT は指定した位置にある 1 文字を返します。from が to よりも大きいときは、$EXTRACT は NULL 文字列を返します。to 引数と共に使用するときは、1 未満の from の値 (ゼロか負の数) は 1 として扱われます。
to
to 引数は、from 引数と共に使用する必要があります。正の整数、* (アスタリスク)、または *-n (アスタリスクとそれに続く負の整数) でなければなりません。to の値が from 以上の整数である場合、$EXTRACT は指定した部分文字列を返します。to の値がアスタリスクのときは、$EXTRACT は、from 文字から文字列の最後までを含む部分文字列を返します。to が文字列の長さより大きい整数の場合も、$EXTRACT は、from 文字から文字列の最後までの部分文字列を返します。
from と to の位置が同じ場合、$EXTRACT は単一の文字を返します。to の位置が from の位置よりも文字列の先頭に近い場合、$EXTRACT は NULL 文字列を返します。
to 引数を省略すると、1 文字のみが返されます。from を指定すると、$EXTRACT は from により識別される文字を返します。to と from の両方を省略すると、$EXTRACT は string の最初の文字を返します。
SET $EXTRACT 構文のみ — to が *+n の場合、SET $EXTRACT は string の末尾の先にオフセット分の文字の範囲を追加します (必要に応じて、空白スペースが埋め込まれます)。from が string の末尾の後の文字位置を示している場合、SET $EXTRACT は文字を追加します。from が string の末尾の前の文字位置を示している場合、SET $EXTRACT は文字の置換と追加の両方を実行します。
*-n および *+n 引数値の指定
変数を使用して *-n または *+n を指定する場合は、常に、引数自体でアスタリスクと符号文字を指定する必要があります。
*-n の有効な指定内容は以下のとおりです。
SET count=2
SET alph="abcd"
WRITE $EXTRACT(alph,*-count)
SET count=-2
SET alph="abcd"
WRITE $EXTRACT(alph,*+count)
*+n の有効な指定内容は以下のとおりです。
SET count=2
SET alph="abcd"
SET $EXTRACT(alph,*+count)="F"
WRITE alph
これらの引数値内では、空白を使用できます。
例 : 部分文字列を返す方法
以下の例は文字列の 4 番目の文字 “D” を返します。
SET x="ABCDEFGHIJK"
WRITE $EXTRACT(x,4)
以下の例は文字列の最後の文字 “K” を返します。
SET x="ABCDEFGHIJK"
WRITE $EXTRACT(x,*)
以下の例では、$EXTRACT 関数は、すべて文字列の最後から 2 番目の文字 “J” を返します。
SET n=-1
SET m=1
SET x="ABCDEFGHIJK"
WRITE !,$EXTRACT(x,*-1)
WRITE !,$EXTRACT(x,*-m)
WRITE !,$EXTRACT(x,*+n)
WRITE !,$EXTRACT(x,*-1,*-1)
アスタリスクと整数変数の間には、マイナス記号かプラス記号が必要です。
以下の例は、from 値が “1” のとき、1-引数形式は 2-引数形式と等しいことを示しています。両方の $EXTRACT 関数は、“H” を返します。
SET x="HELLO"
WRITE !,$EXTRACT(x)
WRITE !,$EXTRACT(x,1)
以下の例は、先頭から 7 番目の文字までの部分文字列 “THIS IS” を返します。
SET x="THIS IS A TEST"
WRITE $EXTRACT(x,1,7)
以下の例も、部分文字列 "THIS IS" を返します。from 変数が 1 未満の値を含むとき、$EXTRACT はその値を 1 として処理します。以下の例は、先頭から 7 番目の文字までの部分文字列を返します。
SET X="THIS IS A TEST"
WRITE $EXTRACT(X,-1,7)
以下の例は文字列の最後の 4 文字を返します。
SET X="THIS IS A TEST"
WRITE $EXTRACT(X,*-3,*)
また、以下の例は文字列の最後の 4 文字も返します。
SET X="THIS IS A TEST"
WRITE $EXTRACT(X,*-3,14)
以下の例では、オブジェクト・プロパティから部分文字列を抽出します。
SET tStatement = ##class(%SQL.Statement).%New()
SET tStatement.%SchemaPath="MyTests,Sample,Cinema"
WRITE "whole schema path: ",tStatement.%SchemaPath,!
WRITE "start of schema path: ",$EXTRACT(tStatement.%SchemaPath,1,10),!
SET $EXTRACT を使用した部分文字列の置換
$EXTRACT を SET コマンドと一緒に使用して、指定した文字または文字列の範囲を別の値で置き換えることができます。また、文字列の末尾に文字を追加する場合にも使用できます。
等号の左側で SET と共に $EXTRACT を使用する場合、string は有効な変数名にすることができます。変数が存在しない場合は、SET $EXTRACT が変数を定義します。string 引数は、多次元プロパティ参照にすることもできますが、非多次元オブジェクト・プロパティにすることはできません。非多次元オブジェクト・プロパティで SET $EXTRACT を使用しようとすると、<OBJECT DISPATCH> エラーが発生します。
$EXTRACT (または $PIECE や $LIST) を伴った SET (a,b,c,...)=value 構文は、その関数で相対オフセット構文 * (文字列の末尾を表す)、*-n または *+n (文字列の末尾からの相対オフセットを表す) を使用する場合、等号の左側では使用できません。その代わりに、SET a=value,b=value,c=value,... 構文を使用する必要があります。
SET $EXTRACT のうちで最も単純な形式は一対一の置き換えです。
SET alph="ABZD"
SET $EXTRACT(alph,3)="C"
WRITE alph ; "ABCD"
string に文字を追加するには、to に string の長さより 1 大きい正の整数を指定するか、to に *+1 を指定します。以下に、この例を示します。
SET alph="ABCD"
SET $EXTRACT(alph,5)="E"
WRITE alph ; "ABCDE"
SET alph="ABCD"
SET $EXTRACT(alph,*+1)="E"
WRITE alph ; "ABCDE"
文字列プラス 1 よりも大きい to を指定すると、$EXTRACT は空白スペースを埋め込みます。
SET alph="ABCD"
SET len=$LENGTH(alph)
SET $EXTRACT(alph,len+2)="F"
WRITE alph ; "ABCD F"
SET alph="ABCD"
SET $EXTRACT(alph,*+2)="F"
WRITE alph ; "ABCD F"
文字列を抽出して、異なる長さの文字列と置き換えることも可能です。例えば、以下のコマンドは foo から文字列 "Rhode Island" を抽出して、埋め込みなしで文字列 "Texas" に置き換えます。
SET foo="Deep in the heart of Rhode Island"
SET $EXTRACT(foo,22,33)="Texas"
WRITE foo ; "Deep in the heart of Texas"
文字列を抽出して、その文字列から抽出された文字を削除しながら、NULL 文字列に設定できます。
SET alph="ABCzzzzzD"
SET $EXTRACT(alph,4,8)=""
WRITE alph ; "ABCD"
to より長い from を指定すると、置換は実行されません。
SET alph="ABCD"
SET $EXTRACT(alph,4,3)="X"
WRITE alph ; "ABCD"
以下の例では、変数 x が存在しないものとします。
KILL x
SET $EXTRACT(x,1,4)="ABCD"
WRITE x ; "ABCD"
SET コマンドは、変数 x を作成して、値 "ABCD" を代入します。
SET $EXTRACT は、必要に応じて空白スペースによる先頭の埋め込みを実行しますが、末尾の埋め込みは実行しません。以下の例では、文字列の末尾より先の 6 番目の位置に値 “F” を挿入していますが、7 番目と 8 番目の位置には追加の文字を挿入していません。
SET alph="ABCD"
SET $EXTRACT(alph,6,8)="F"
WRITE alph ; "ABCD F"
以下の例では、6 番目の位置に値 “F” を挿入して、指定した範囲の後に文字を追加しています。
SET alph="ABCD"
SET $EXTRACT(alph,6,8)="FGHIJ"
WRITE alph ; "ABCD FGHIJ"
以下の例は、置き換える文字列の値の数よりも長い from,to 範囲を抽出することにより文字列を短くします。
SET x="ABCDEFGH"
SET $EXTRACT(x,3,6)="Z"
WRITE x
これは、3 番目に値 "Z" を挿入して、位置 4 と 5 と 6 の文字を削除します。変数 x の値は "ABZGH" になり、5 文字列長になります。
$EXTRACT と Unicode
$EXTRACT 関数は、バイトではなく、文字を処理します。したがって、以下の例で示すように、Unicode の文字列は ASCII 文字列と同様に処理されます。以下の例では、"pi" ($CHAR(960)) に対して Unicode 文字を使っています。
SET a="QT PIE"
SET b="QT "_$CHAR(960)
SET a1=$EXTRACT(a,-33,4)
SET a2=$EXTRACT(a,4,4)
SET a3=$EXTRACT(a,4,99)
SET b1=$EXTRACT(b,-33,4)
SET b2=$EXTRACT(b,4,4)
SET b3=$EXTRACT(b,4,99)
WRITE !,"ASCII form returns ",!,a1,!,a2,!,a3
WRITE !,"Unicode form returns ",!,b1,!,b2,!,b3
詳細は "Unicode" を参照してください。
サロゲート・ペア
$EXTRACT は、サロゲート・ペアを認識しません。サロゲート・ペアは、一部の中国語の文字を表示したり、日本語の JIS2004 標準をサポートするために使用されます。$WISWIDE 関数を使用して、文字列にサロゲート・ペアが含まれているかどうかを判断することができます。$WEXTRACT 関数は、サロゲート・ペアを認識して、正しく解析します。$EXTRACT と $WEXTRACT は、それ以外は同一です。 ただし、$EXTRACT は通常 $WEXTRACT より高速なため、サロゲート・ペアが出現しない場合は常に $EXTRACT が推奨されます。
$PIECE と $LIST と比較した $EXTRACT コマンド
$EXTRACT は、文字列の最初の部分から文字をカウントすることにより、部分文字列を決定します。$EXTRACT は、入力として通常の任意の文字列を取ります。$PIECE と $LIST は両方とも、特別に用意された文字列を処理します。
$PIECE は、文字列内のユーザ定義の区切り文字をカウントすることにより、部分文字列を決定します。
$LIST は、リストの最初から要素 (文字ではない) をカウントすることにより、エンコードされたリストから要素を決定します。$LIST は、通常の文字列に対して使用できません。また、$EXTRACT は、エンコードされたリストに対して使用できません。