第三十八章 Caché 函数大全 $LOCATE 函数 第三十八章 Caché 函数大全 $LOCATE 函数 大纲 描述 参数 示例

第三十八章 Caché 函数大全 $LOCATE 函数

在字符串中找到正则表达式的第一个匹配项。

大纲

$LOCATE(string,regexp,start,end,val)

参数

  • string 要匹配的字符串。
  • regexp 与字符串匹配的正则表达式。正则表达式由一个或多个元字符组成,并且还可以包含文字字符。
  • start 可选—一个整数,指定字符串中与regexp匹配的起始位置。如果省略开始,则匹配从字符串的开头开始。如果省略开始并指定end和/或val,则必须指定占位符逗号。
  • end 可选-如果匹配成功,$LOCATE会为该变量分配一个整数值。该整数是匹配字符串之后的下一个字符位置。 Caché通过引用结束。此参数必须是局部变量。它不能是数组,全局变量或对对象属性的引用。
  • val 可选-如果匹配成功,$LOCATE会为该变量分配一个字符串值。该字符串由匹配的子字符串组成。 Caché通过引用传递val。此参数必须是局部变量。它不能是数组,全局变量或对对象属性的引用。

描述

$LOCATE将正则表达式与指定字符串的连续子字符串匹配。它返回一个整数,该整数指定字符串中第一个正则表达式匹配项的开始位置。它从1开始计数位置。如果regexp与字符串的任何子集都不匹配,则返回0。

也可以选择将匹配的子字符串分配给变量。

如果省略可选参数并指定更高版本的参数,则必须指定适当的占位符逗号。

ObjectScript对正则表达式的支持由$LOCATE$MATCH函数组成:

  • $LOCATE将正则表达式与string的连续子字符串匹配,并返回第一个匹配项的位置(以及可选的值)。
  • $MATCH将正则表达式与完整字符串匹配,并返回一个布尔值,指示是否发生匹配。

%Regex.Matcher类的Locate()方法提供的功能与$LOCATE类似。 %Regex.Matcher类方法为使用正则表达式提供了实质性的附加功能。

参数

string

计算结果为字符串的表达式。可以将表达式指定为变量的名称,数值,字符串文字或任何有效的ObjectScript表达式。字符串可以包含控制字符。

如果string是空字符串,而regexp无法匹配空字符串,则$LOCATE返回0;否则,返回$LOCATE。没有设置end和val。

如果string是空字符串,并且regexp可以匹配空字符串,则$LOCATE返回1; end设置为1,而val设置为空字符串。

regexp

用于与字符串匹配以找到所需子字符串的正则表达式。正则表达式是计算结果为包含元字符和文字的某种组合的字符串的表达式。元字符指定字符类型和匹配模式。文字指定一个或多个匹配的单个字符,字符范围或子字符串。支持广泛的正则表达式语法。

start

一个整数,指定字符串中与regexp匹配的起始位置。 1或0指定从字符串的开头开始。等于字符串+ 1的长度的起始值始终返回0。大于字符串+ 1的长度的起始值会生成错误,错误代码为8351。

不管起始位置如何,$LOCATE都会返回从字符串开头算起的第一个匹配项的位置。

end

如果定位操作找到匹配项,则$LOCATE的输出变量将分配一个整数值。分配的值是匹配的子字符串之后第一个字符位置的位置,从字符串的开头算起。如果匹配发生在字符串的末尾,则此字符位置可能比字符串总长度大一。如果找不到匹配项,则结束值保持不变。如果没有预先设置end,则变量保持未定义状态。

结束变量不能是对对象属性的引用。

通过使用相同的变量作为开始和结束,可以重复调用$LOCATE来查找字符串中的所有匹配项。在下面的示例中显示了该示例,该示例在字母表中定位了元音的位置:

/// d ##class(PHA.TEST.Function).LOCATE()
ClassMethod 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,! 
        w "pos" _ pos,!
    }
}
DHC-APP>d ##class(PHA.TEST.Function).LOCATE()
1 is the position of the 1th vowel: a
pos2
5 is the position of the 2th vowel: e
pos6
9 is the position of the 3th vowel: i
pos10
15 is the position of the 4th vowel: o
pos16
21 is the position of the 5th vowel: u
pos22

val

如果定位操作找到匹配项,则$LOCATE的输出变量将分配字符串值。该字符串值是匹配的子字符串。如果找不到匹配项,则val值保持不变。如果先前未设置val,则该变量将保持未定义状态。 val变量不能是对对象属性的引用。

示例

以下示例返回4,因为正则表达式文字“de”与字符串:y的第4个字符匹配。

DHC-APP>WRITE $LOCATE("abcdef","de")
4

下面的示例返回8,因为regexp指定了一个三个字符的小写字母字符串,在此首先在位置8的子字符串“fga”中找到它:

DHC-APP>WRITE $LOCATE("ABC-de-fgabc123ABC","[[:lower:]]{3}")
8

以下示例返回5,因为找到的指定的正则表达式格式为空格(\s)和非空格字符(\S)从字符串的第5个字符开始。本示例省略了start参数;它将结束变量设置为11,这是匹配的子字符串之后的字符。

DHC-APP>WRITE $LOCATE("AAAAA# $ 456789","\S\S\s\S\s\S",,end)
5

以下示例返回9,因为regexp指定了三个字符的字母字符串,并且start参数声明它必须在位置6或之后开始:

/// d ##class(PHA.TEST.Function).LOCATE1()
ClassMethod LOCATE1()
{
    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
}
DHC-APP>d ##class(PHA.TEST.Function).LOCATE1()
9
the position after the matched string is: 12
the matched value is: ghi

下面的示例显示在将regexp与结果字符串匹配之前,将数字解析为规范形式。 end参数设置为5,超出4个字符的字符串“1.23”的末尾一个字符:

/// d ##class(PHA.TEST.Function).LOCATE2()
ClassMethod LOCATE2()
{
    WRITE $LOCATE(123E-2,"\.\d*",1,end,val),!
    WRITE "end is: ",end,!
    WRITE "value is: ",val,!
}
DHC-APP>d ##class(PHA.TEST.Function).LOCATE2()
2
end is: 5
value is: .23
 

下面的示例将start参数设置为大于string + 1长度的值。这将导致错误,如下所示:

/// d ##class(PHA.TEST.Function).LOCATE3()
ClassMethod LOCATE3()
{
    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
    }
}
DHC-APP>d ##class(PHA.TEST.Function).LOCATE3()
start=string length, match=6
start=string length+1, match=0
start=string length+2, match=
 
CATCH block exception handler:
System exception
Name: <REGULAR EXPRESSION>
Location: zLOCATE3+6^PHA.TEST.Function.1
Code: 27
 
%Regex.Matcher status:
错误 #8351: 索引(如组号)超出范围
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章