$LOCATE(string,regexp,start,end,val)
引数
string
文字列として評価される式。この式には、変数名や数値、文字列リテラル、その他の有効な ObjectScript 式を指定できます。string には、制御文字を含めることができます。
string が空の文字列で、regexp が空の文字列と一致できない場合は、$LOCATE が 0 を返し、end および val は設定されません。
string が空の文字列で、regexp が空の文字列と一致できる場合は、$LOCATE が 1 を返し、end が 1、および val が空の文字列に設定されます。
regexp
目的の部分文字列を検索するために、string に一致させるために使用する正規表現。正規表現は、メタ文字とリテラルのいくつかの組み合わせで構成された文字列を評価する式です。メタ文字は、文字の種類と一致パターンを指定します。リテラルは、1 つ以上の単一文字、文字の範囲、または部分文字列との一致を指定します。広範囲にわたる正規表現の構文をサポートしています。詳細は、"ObjectScript の使用法" の “正規表現” の章を参照してください。
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
}