模式匹配

138 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第34天,点击查看活动详情

模式匹配

Caché支持两种模式匹配系统:

  • Caché模式匹配是一种用问号(?)分隔模式字符串开头的语法。或('?)。
  • 正则表达式可以与$LOCATE$MATCH函数以及%Regex.Matcher类的方法一起使用。(这些函数方法在2016之后才有,2010版本没有。)

这些模式匹配系统是完全独立的。每个模式匹配系统只能在其自己的上下文中使用。但是,可以使用逻辑AND和OR语法组合来自不同模式匹配系统的模式匹配测试。

	s var = "abcDEf"
	if (var ?.e2U.e) && $match(var, "^.{3,7}") { 
		w "match!"
	} else { 
		w "no match"
	}
  • 模式匹配运算符测试其左操作数中的字符是否由右操作数中的模式正确指定。它返回一个布尔值。当模式正确指定左操作数中的字符模式时,模式匹配运算符会产生TRUE(1)结果。如果模式没有正确指定左操作数中的字符模式,则生成FALSE(0)结果。
	s str = "521-13-1411"
 	s match = str ? 3N1"-"2N1"-"4N
 	w match,!

提供的特殊模式代码

代码含义
A匹配任何大写或小写字母字符。包括ASCII值65到90(A到Z)、97到122(a到z)、170、181、186、192到214、216到246和248到255
C匹配任何ASCII控制字符(ASCII值0到31和扩展ASCII值127到159)
E匹配任何字符,包括非打印字符、空格字符和控制字符。
L匹配任何小写字母字符。包括ASCII值97到122(a到z)、170、181、186、223到246和248到255
N匹配10个数字字符0到9(ASCII 48到57)中的任何一个。
P匹配任何标点符号。包括ASCII值32到47、58到64、91到96、123到126、160到169、171到177、180、182到184、187、191、215和247
U匹配任何大写字母字符。包括ASCII值65到90(A到Z)、192到214和216到222
R,B,M匹配西里尔8位字母字符映射。R匹配任何西里尔字符(ASCII值192到255)。B匹配大写西里尔字符(ASCII值192到223)。M匹配小写西里尔字符(ASCII值为224到255)。这些模式代码仅在俄语8位Windows区域设置(Ruw8)中有意义。在其他地区,可以成功执行,但无法匹配任何字符。
ZFWCHARZ匹配日语ZENKAKU字符集中的任何字符。ZFWCHARZ匹配全角字符,例如汉字范围中的字符,以及在某些终端仿真器显示时占用双倍单元格的许多非汉字字符。ZFWCHARZ还匹配JIS2004标准中定义的303个代理项对字符,将每个代理项对视为单个字符。例如,代理项对字符$WC(131083)?1ZFWCHARZ匹配。此模式匹配代码需要日语区域设置。
ZHWKATAZ匹配日文汉字假名字符集中的任何字符。这些是Unicode65377(FF61)65439(FF9F)。此模式匹配代码需要日语区域设置。
	s var = "A"
	w "字母字符? "
	w var ? 1A,!
	
	s var = $char(10)
	w "控制字符? "
	w var ? 1C,!
	
	s var = $char(13) _ "A" _ "a"
	w "任何字符? "
	w var ? 3E,!
	
	s var = "a"
	w "小写字母? "
	w var ? 1L,!
	
	s var = "2"
	w "数字字符? "
	w var ? 1N,!
	
	s var = "."
	w "标点符号? "
	w var ? 1P,!
	
	s var = "U"
	w "大写字母? "
	w var ? 1U,!
  • 特殊模式代码不区分大小写;可以用大写或小写指定。
	s str = "12345"
 	s match = str ? 5N
 	w match,!
 	
 	s match = str ? 5n
 	w match,!
 	
	s str = "1"
 	s match = str ? 1NU
 	w match,!
 	
 	s str = "A"
 	s match = str ? 1nu
 	w match,!