$WEXTRACT (ObjectScript)
構文
$WEXTRACT(string,from,to)
$WE(string,from,to)
SET $WEXTRACT(string,from,to)=value
SET $WE(string,from,to)=value
引数
引数 | 説明 |
---|---|
string | 部分文字列が識別されるターゲット文字列。string には、評価結果が引用符で囲んだ文字列または数値になる式を指定します。SET $WEXTRACT 構文では、string は変数または多次元プロパティにする必要があります。 |
from |
オプション — 対象の文字列内の開始位置を指定します。文字は 1 からカウントされます。サロゲート・ペアは単一の文字としてカウントされます。許可される値は、n (string の先頭からの文字カウントで開始位置を指定する正の整数)、* (string の末尾文字の指定)、および *-n (string の末尾から逆向きの文字のオフセット整数カウント) です。SET $WEXTRACT 構文は、*+n (string の末尾の先に追加する文字のオフセット整数カウント) もサポートします。指定されていない場合、既定は 1 です。2 引数形式 $WEXTRACT(string,from) および 3 引数形式 $WEXTRACT(string,from,to) には、さまざまな値が使用されます。 to なし : 単一の文字を指定します。string の先頭からカウントするには、正の整数に評価する式 (1 からカウントする) を指定します。ゼロ (0) または負の数を指定すると、空の文字列が返されます。string の末尾からカウントするには、*、または *-n を指定します。from が省略されている場合は、既定値の 1 が使用されます。 to あり : 文字の範囲の先頭を指定します。string の先頭からカウントするには、正の整数に評価する式 (1 からカウントする) を指定します。ゼロ (0) または負の数字は 1 として評価されます。string の末尾からカウントするには、*、または *-n を指定します。 |
to |
オプション — 文字の範囲の終了位置 (その文字を含む) を指定します。from と共に使用する必要があります。許可される値は、n (string の先頭から文字カウントで終了位置を指定する、from に指定された値以上の正の整数)、* (string の末尾文字の指定)、および *-n (string の末尾からの逆向きでの文字のオフセット整数カウント) です。 サロゲート・ペアは単一の文字としてカウントされます。文字列の末尾を超える to 値を指定できます。 SET $WEXTRACT 構文は、*+n (string の末尾の先に追加する文字範囲の終了位置のオフセット整数カウント) もサポートします。 |
説明
$WEXTRACT は、string の先頭から文字をカウントするか、または string の末尾からのオフセットで文字をカウントすることで、指定された位置での string 内の部分文字列を識別します。部分文字列には、1 文字または文字の範囲を指定できます。$WEXTRACT は、サロゲート・ペアを単一の文字として認識します。
$EXTRACT には、以下の 2 つの使用方法があります。
-
string から部分文字列を返します。これには構文 $WEXTRACT(string,from,to) が使用されます。
-
string 内の部分文字列を置き換えます。置換部分文字列は、元の部分文字列と同じ長さでも、長くても、短くてもかまいません。これには構文 SET $WEXTRACT(string,from,to)=value が使用されます。
$WEXTRACT と $EXTRACT は機能的に同じです。ただしサロゲート・ペアの処理が異なります。
サロゲート・ペア
$WEXTRACT の from 引数と to 引数は、サロゲート・ペアを単一の文字としてカウントします。$WISWIDE 関数を使用して、文字列にサロゲート・ペアが含まれているかどうかを判断することができます。
サロゲート・ペアは、単一の Unicode 文字を一緒にエンコードする 16 ビットの InterSystems IRIS 文字要素のペアです。サロゲート・ペアは、中国語、日本語の漢字、韓国語のハンジャ文字で使用されている特定の表意文字を表すために使用されます (頻繁に使用される中国語、漢字、およびハンジャ文字は、標準 16 ビットの Unicode エンコードで表されます)。サロゲート・ペアにより、InterSystems IRIS は日本語 JIS X0213:2004 (JIS2004) エンコーディング標準および中国語 GB18030 エンコーディング標準をサポートします。
サロゲート・ペアは、16 進数の D800 ~ DBFF の範囲の高位 16 ビット文字要素と、16 進数の DC00 ~ DFFF の範囲の下位 16 ビット文字要素で構成されます。
$WEXTRACT 関数は、サロゲート・ペアを単一の文字として処理します。$EXTRACT 関数は、サロゲート・ペアを 2 文字として処理します。文字列にサロゲート・ペアが含まれていない場合、$WEXTRACT と $EXTRACT のいずれかを使用できます。どちらも同じ値が返されます。ただし、$EXTRACT は通常 $WEXTRACT より高速なため、サロゲート・ペアが出現しない場合は常に $EXTRACT が推奨されます。部分文字列の抽出の詳細は、$EXTRACT 関数を参照してください。
部分文字列を返す方法
$WEXTRACT は、string から文字位置により部分文字列を返します。この部分文字列の抽出の特性は、使用する引数によって決まります。
-
$WEXTRACT(string) は、文字列の先頭文字を抽出します。
-
$WEXTRACT(string,from) は、from で指定した位置の 1 文字を抽出します。from の値は、文字列の最初からカウントした整数の文字数、文字列の最後の文字を指定するアスタリスク、または、文字列の最後から逆方向にカウントして指定する負の整数を持つアスタリスクになります。
以下の例では、サロゲート・ペアを含む文字列から 1 つの文字を抽出します。$LENGTH はサロゲート・ペアを 2 文字とカウントしますが、$WEXTRACT はサロゲート・ペアを 1 文字とカウントします。
SET hipart=$CHAR($ZHEX("D806")) SET lopart=$CHAR($ZHEX("DC06")) SET spair=hipart_lopart /* surrogate pair */ WRITE "length of surrogate pair ",$LENGTH(spair),! SET mystr="AB"_spair_"DEFG" WRITE !,$WEXTRACT(mystr,4) // "D" the 4th character WRITE !,$WEXTRACT(mystr,*) // "G" the last character WRITE !,$WEXTRACT(mystr,*-5) // "B" the offset 5 character from end WRITE !,$WEXTRACT(mystr,*-0) // "G" the last character by 0 offset
-
$WEXTRACT(string,from,to) は、from の位置から始まり、to の位置で終了する文字列の範囲 (その位置の文字を含む) を抽出します。以下の $WEXTRACT 関数は、サロゲート・ペアを単一文字とカウントして、両方とも文字列 “Alabama” を返します。
SET hipart=$CHAR($ZHEX("D806")) SET lopart=$CHAR($ZHEX("DC06")) SET spair=hipart_lopart /* surrogate pair */ SET var2=spair_"XXX"_spair_"Alabama"_spair WRITE !,$WEXTRACT(var2,6,12) WRITE !,$WEXTRACT(var2,*-7,*-1)
from と to の位置が同じ場合、$WEXTRACT は単一の文字を返します。to の位置が from の位置よりも文字列の先頭に近い場合、$WEXTRACT は NULL 文字列を返します。
部分文字列の置換
$WEXTRACT を SET コマンドと一緒に使用して、指定した文字または文字列の範囲を別の値で置き換えることができます。また、文字列の末尾に文字を追加する場合にも使用できます。SET $WEXTRACT はサロゲート・ペアを単一の文字として認識します。
等号の左側で SET と共に $WEXTRACT を使用する場合、string は有効な変数名にすることができます。変数が存在しない場合は、SET $WEXTRACT が変数を定義します。string 引数は、多次元プロパティ参照にすることもできますが、非多次元オブジェクト・プロパティにすることはできません。非多次元オブジェクト・プロパティで SET $WEXTRACT を使用しようとすると、<OBJECT DISPATCH> エラーが発生します。
$WEXTRACT (または $EXTRACT、$PIECE、あるいは $LIST) を伴った SET (a,b,c,...)=value 構文は、その関数で相対オフセット構文 * (文字列の末尾を表す) と *-n または *+n (文字列の末尾からの相対オフセットを表す) を使用する場合、等号の左側では使用できません。その代わりに、SET a=value,b=value,c=value,... 構文を使用する必要があります。
部分文字列の置換の詳細は、"$EXTRACT" 関数を参照してください。
例
以下の例は、サロゲート・ペアの Unicode 値を返す 2 引数形式の $WEXTRACT を示します。
SET hipart=$CHAR($ZHEX("D806"))
SET lopart=$CHAR($ZHEX("DC06"))
SET spair=hipart_lopart /* surrogate pair */
SET x="ABC"_spair_"DEFGHIJK"
WRITE !,"$EXTRACT character "
ZZDUMP $EXTRACT(x,4)
WRITE !,"$WEXTRACT character "
ZZDUMP $WEXTRACT(x,4)
以下の例は、部分文字列の範囲にサロゲート・ペアを含む 3 引数形式の $WEXTRACT を示します。
SET hipart=$CHAR($ZHEX("D806"))
SET lopart=$CHAR($ZHEX("DC06"))
SET spair=hipart_lopart /* surrogate pair */
SET x="ABC"_spair_"DEFGHIJK"
WRITE !,"$EXTRACT two characters "
ZZDUMP $EXTRACT(x,3,4)
WRITE !,"$WEXTRACT two characters "
ZZDUMP $WEXTRACT(x,3,4)