$LOCATE (ObjectScript)
構文
$LOCATE(string,regexp,start,end,val)
引数
引数 | 説明 |
---|---|
string | 一致対象の文字列。 |
regexp | string に一致させる正規表現。正規表現は、1 つ以上のメタ文字で構成し、リテラル文字を含めることもできます。 |
start |
オプション — regexp が一致を開始する string 内の開始位置を指定する整数。 start を省略する場合、マッチングが string の先頭から開始されます。start を省略し、end と val のいずれかまたは両方を指定する場合、プレースホルダのコンマを指定する必要があります。 |
end | オプション — 一致に成功した場合 $LOCATE によってこの変数に整数が割り当てられます。この整数は、一致した文字列の後の次の文字位置です。InterSystems IRIS は、参照によって end を渡します。この引数はローカル変数にする必要があります。配列、グローバル変数、オブジェクト・プロパティへの参照は使用できません。 |
val | オプション — 一致に成功した場合 $LOCATE によってこの変数に文字列値が割り当てられます。この文字列は一致した文字列で構成されます。InterSystems IRIS は、参照によって val を渡します。この引数はローカル変数にする必要があります。配列、グローバル変数、オブジェクト・プロパティへの参照は使用できません。 |
説明
$LOCATE は、正規表現を指定された文字列の連続する部分文字列に対して一致させます。string 内で、最初の regexp の一致の開始位置を指定する整数です。1 から始まる値で位置をカウントします。regexp が、string の一部と一致しない場合、0 を返します。
オプションで、一致部分文字列を変数に割り当てることができます。
あるオプション引数を省略し、それよりも後の引数を指定する場合、プレースホルダのコンマを指定する必要があります。
ObjectScript は、$LOCATE および $MATCH 関数で構成された正規表現をサポートします。
-
$LOCATE は、正規表現と string の部分一致を検出し、最初の一致の位置 (およびオプションで値) を返します。
-
$MATCH は、正規表現と string の完全一致を検出し、一致が発生したかどうかを示すブーリアンを返します。
%Regex.MatcherOpens in a new tab クラスの Locate()Opens in a new tab メソッドは、$LOCATE と類似する機能を提供します。%Regex.MatcherOpens in a new tab クラス・メソッドは、正規表現を使用するための有効な追加機能を提供します。
その他の ObjectScript のマッチング処理では、InterSystems IRIS パターン・マッチング演算子が使用されます。
引数
string
文字列として評価される式。この式には、変数名や数値、文字列リテラル、その他の有効な ObjectScript 式を指定できます。string には、制御文字を含めることができます。
string が空の文字列で、regexp が空の文字列と一致できない場合は、$LOCATE が 0 を返し、end および val は設定されません。
string が空の文字列で、regexp が空の文字列と一致できる場合は、$LOCATE が 1 を返し、end が 1、および val が空の文字列に設定されます。
regexp
目的の部分文字列を検索するために、string に一致させるために使用する正規表現。正規表現は、メタ文字とリテラルのいくつかの組み合わせで構成された文字列を評価する式です。メタ文字は、文字の種類と一致パターンを指定します。リテラルは、1 つ以上の単一文字、文字の範囲、または部分文字列との一致を指定します。広範囲にわたる正規表現の構文をサポートしています。詳細は、"正規表現" を参照してください。
start
regexp が一致を開始する string 内の開始位置を指定する整数。1 または 0 で、string の先頭からの開始を指定します。start の値が、文字列 +1 の長さと等しい場合、常に 0 が返されます。start の値が、文字列 +1 の長さよりも大きい場合、ERROR #8351 の <REGULAR EXPRESSION> エラーが返されます。
start の位置に関係なく、$LOCATE は、最初の一致の位置を文字列の先頭からのカウントで返します。
end
検索処理で一致が検出された場合 $LOCATE によって整数が割り当てられる出力変数。割り当てられる値は、一致した部分文字列の後の最初の文字の位置を文字列の先頭からのカウントで表したものです。一致が文字列の最後で発生した場合は、この文字の位置が文字列全体の長さに 1 を加えた値になる可能性があります。一致が検出されなかった場合は、end の値は変更されません。end が未定義の場合、この値は未定義のままになります。
end 変数をオブジェクトのプロパティへの参照として使用することはできません。
start および end に同じ変数を使用することで、$LOCATE を繰り返し呼び出して、文字列内のすべての一致を検出できます。この例を以下に示します。この例は、アルファベットの母音の位置を検出します。
SET alphabet="abcdefghijklmnopqrstuvwxyz"
SET pos=1
SET val=""
FOR i=1:1:5 {
WRITE $LOCATE(alphabet,"[aeiou]",pos,pos,val)
WRITE " is the position of the ",i,"th vowel: ",val,! }
val
検索処理で一致が検出された場合 $LOCATE によって文字列が割り当てられる出力変数。この文字列値は一致した文字列です。一致が検出されなかった場合は、val の値は変更されません。val が未定義の場合、この値は未定義のままになります。
val 変数をオブジェクトのプロパティへの参照として使用することはできません。
例
以下の例は、regexp のリテラル “de” が文字列の 4 番目の文字と一致するため 4 を返します。
WRITE $LOCATE("abcdef","de")
以下の例は、regexp が 3 文字の小文字の文字列を指定し、ここで検出されるのは “fga” の部分文字列で、開始位置が 8 であるため 8 が返されます。
WRITE $LOCATE("ABC-de-fgabc123ABC","[[:lower:]]{3}")
以下の例は、指定された regexp のスペース文字 (\s) および非スペース文字 (\S) の形式が、文字列の 5 番目の文字から始まっていることが検出されたため 5 を返します。この例では、start 引数を省略し、一致した部分文字列の後の文字である end 変数を 11 に設定します。
WRITE $LOCATE("AAAAA# $ 456789","\S\S\s\S\s\S",,end)
以下の例は、regexp が 3 文字の文字列を指定し、start 引数が 6 文字目以降から始まる必要があることを指定しています。
SET end="",val=""
WRITE $LOCATE("abc-def-ghi-jkl","[[:alpha:]]{3}",6,end,val),!
WRITE "the position after the matched string is: ",end,!
WRITE "the matched value is: ",val
end 引数が 12 に設定され、val 引数が “ghi” に設定されます。
以下の例は、regexp が結果文字列と一致する前に、数値がキャノニック形式に解決されることを示しています。end 引数は 5 に設定され、4 文字の文字列 “1.23” の末尾を超えた 1 文字を示します。
WRITE $LOCATE(123E-2,"\.\d*",1,end,val),!
WRITE "end is: ",end,!
WRITE "value is: ",val,!
以下の例は、start 引数を string+1 の長さより大きい値に設定します。これにより、以下に示すようにエラーが発生します。
TRY {
SET str="abcdef"
SET strlen=$LENGTH(str)
WRITE "start=string length, match=",$LOCATE(str,"\p{L}",strlen),!
WRITE "start=string length+1, match=",$LOCATE(str,"\p{L}",strlen+1),!
WRITE "start=string length+2, match=",$LOCATE(str,"\p{L}",strlen+2),!
}
CATCH exp {
WRITE !!,"CATCH block exception handler:",!
IF 1=exp.%IsA("%Exception.SystemException") {
WRITE "System exception",!
WRITE "Name: ",$ZCVT(exp.Name,"O","HTML"),!
WRITE "Location: ",exp.Location,!
WRITE "Code: ",exp.Code,!!
WRITE "%Regex.Matcher status:"
SET err=##class(%Regex.Matcher).LastStatus()
DO $SYSTEM.Status.DisplayError(err) }
ELSE {WRITE "Unexpected exception type",! }
RETURN
}