第三十八章 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: 索引(如組號)超出範圍