第三十九章 Caché 函數大全 $MATCH 函數
將正則表達式與字符串匹配。
大綱
$MATCH(string,regexp)
參數
- string 要匹配的字符串。
- regexp 與字符串匹配的正則表達式。正則表達式由一個或多個元字符組成,並且還可以包含文字字符。
描述
$MATCH
是一個布爾函數,如果字符串和正則表達式匹配,則返回1,如果字符串和正則表達式不匹配,則返回0。默認情況下,匹配區分大小寫。
ObjectScript對正則表達式的支持由$LOCATE
和$MATCH
函數組成:
-
$MATCH
將正則表達式與完整字符串匹配,並返回一個布爾值,指示是否發生匹配。 -
$LOCATE
將正則表達式與字符串的連續子字符串進行匹配,並返回第一個匹配項的位置(以及可選的值)。
%Regex.Matcher
類的Match()
方法提供相同的功能。 %Regex.Matcher
類提供使用正則表達式的其他功能。
其他ObjectScript匹配操作使用Caché模式匹配運算符。
參數
string
計算結果爲字符串的表達式。可以將表達式指定爲變量的名稱,數值,字符串文字或任何有效的ObjectScript表達式。字符串可以包含控制字符。
regexp
用於匹配字符串的正則表達式。正則表達式是計算結果爲包含元字符和文字的某種組合的字符串的表達式。元字符指定字符類型和匹配模式。文字指定一個或多個匹配的單個字符,字符範圍或子字符串。支持廣泛的正則表達式語法。
示例
下面的示例將字符串與正則表達式匹配,該正則表達式指定第一個字符必須是大寫字母(\p{LU}
),後跟至少一個附加字符(+限定符),並且第二個字符和所有後續字符必須是單詞字符(字母、數字或下劃線字符)(\w
):
/// d ##class(PHA.TEST.Function).MATCH()
ClassMethod MATCH(n)
{
SET strng(1)="Assembly_17"
SET strng(2)="Part5"
SET strng(3)="SheetMetalScrew"
WHILE $DATA(strng(n)) {
IF $MATCH(strng(n),"\p{LU}\w+") {
WRITE strng(n)," : 匹配成功",!
} ELSE {
WRITE strng(n)," : 無效字符",!
}
SET n=n+1
}
}
DHC-APP>d ##class(PHA.TEST.Function).MATCH(1)
Assembly_17 : 匹配成功
Part5 : 匹配成功
SheetMetalScrew : 匹配成功
下面的示例返回1,因爲十六進制正則表達式(十六進制41)與字母“A”
匹配:
DHC-APP>WRITE $MATCH("A","\x41")
1
DHC-APP>WRITE $MATCH("B","\x42")
1
下面的示例返回1,因爲指定的字符串與正則表達式中指定的空格(\s
)和非空格字符(\S
)的格式匹配:
DHC-APP>WRITE $MATCH("A# $ 4","\S\S\s\S\s\S")
1
下面的示例返回1,因爲指定的日期與正則表達式中指定的數字和文字格式匹配:
/// d ##class(PHA.TEST.Function).MATCH1()
ClassMethod MATCH1()
{
SET today=$ZDATE($HOROLOG)
WRITE $MATCH(today,"^\d\d/\d\d/\d\d\d\d$")
}
DHC-APP>d ##class(PHA.TEST.Function).MATCH1()
1
請注意,此格式要求日和月分別指定爲兩位數,因此小於10的值需要前導零。
下面的示例返回1,因爲字符串中的每個字母都在正則表達式中對應的字母範圍內:
DHC-APP>WRITE $MATCH("HAL","[G-I][A-C][K-Z]")
1
以下示例指定了無效的regexp參數。這會導致錯誤,如下所示:
/// d ##class(PHA.TEST.Function).MATCH2()
ClassMethod MATCH2()
{
TRY {
SET str="abcdef"
WRITE "match=",$MATCH(str,"\p{}"),!
}
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).MATCH2()
match=
CATCH block exception handler:
System exception
Name: <REGULAR EXPRESSION>
Location: zMATCH2+3^PHA.TEST.Function.1
Code: 27
%Regex.Matcher status:
錯誤 #8352: 非法參數,例如模式的空字符串