第三十九章 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: 非法参数,例如模式的空字符串
网友评论