明经通道 AutoLISP 函数  
wcmatch
 

将模式字符串与某指定的字符串进行匹配比较

(wcmatch string pattern) 

参数

string

要比较的字符串。比较是区分大小写的,所以必须严格匹配大小写字符。

pattern

模式字符串,包含与 string 进行匹配的模式。pattern 可以包含表通配符中所列的通配符。在多个模式条件之间用逗号 (,) 分隔。函数仅比较 string 和 pattern 的前 500 个字符(约数),后面的字符将被省略。

这两个参数既可以是由双引号引起来的字符串,也可以是变量。可以使用其他 明经通道 AutoLISP 函数返回的变量和值作为 string 和 pattern 的值。

返回值

如果 string 和 pattern 匹配,wcmatch 返回 T,否则 wcmatch 返回 nil。

通配符

通配符

定义

# (磅值符号)

匹配任意单个数值字符

@ (at)

匹配任意单个字母字符

. (句号)

匹配任意单个非字母数值字符

* (星号)

匹配任意字符序列,包括空字符串,它可以出现在任何位置,包括开头、中间和结尾处

? (问号)

匹配任意单个字符

~ (波浪号)

如果它是模式字符串的第一个字符,则匹配除此字符串之外的任意字符串

[...]

匹配括号中的任意一个字符

[~...]

匹配不在括号中的任意单个字符

(连字符)

用在括号里面,用来指明单个字符的取值范围

, (逗点)

分隔两个模式字符串

` (单引号)

特殊转义字符(按字义读取随后的字符)

示例

该例子测试字符串 "Name" 是否以字符 N 开头:

命令: (wcmatch "Name" "N*")

T

下例进行三个比较。只要字符串匹配三个模式字符串中的任何一个,wcmatch 返回 T。在本例中进行的测试有:

如果满足其中至少一个条件,则 wcmatch 返回 T:

命令: (wcmatch "Name" "???,~*m*,N*")

T

本例中满足最后一个条件,所以 wcmatch 返回 T。

在 wcmatch 中使用转义字符

要测试一个字符串中的通配符,可以使用单个单引号 (`) 来转义字符。转义是指跟在单个单引号后面的字符不当作通配符读取,而是按其表面值进行比较。例如,为了测试在字符串 Name 中是否包含逗号,可以使用如下表达式:

命令: (wcmatch "Name" "*`,*")

nil

由于 C 和 AutoLISP 程序设计语言都使用反斜杠 (\) 作为转义字符,所以在字符串中必须使用两个反斜杠 (\\) 才能表示一个反斜杠。为了测试字符串 Name 中是否包含一个反斜杠,可以使用如下表达式:

命令: (wcmatch "Name" "*`\\*")

nil

所有包含在括号 ([ . . . ]) 中的字符都按字义读取,所以不必使用转义字符。但有如下例外:只有当波浪线字符 (~) 不是括号里的第一个字符(如 [A~BC])时才按字义读取;否则作为一个“非”字符读取它,这意味着 wcmatch 函数将匹配跟随在波浪号之后那些字符(如 [~ABC])之外的所有字符。而连字符 (-) 则只有当它是括号中的第一个字符或最后一个字符(如 [-ABC] 或 [ABC-]),或者它跟在前导的波浪号后面时,才按字义读取。否则,在括号中的连字符用于指定某特定字符的取值范围。该范围仅限于单个字符,所以,STR[1-38] 与 STR1、STR2、STR3 和 STR8 匹配,而 [A-Z] 与任意单个大写字母匹配。

如果闭括号 ("]") 是括号内的首个字符或跟随在波浪号之后(如 [ ]ABC] 或 [~]ABC]),它将被按字义读取。

注意 由于 AutoLISP 的后续版本中可能会加入其他的通配符,所以建议在样本中给所有非字母数值字符加上转义字符转义,以确保它的向上兼容性。

明经通道 版权所有 未经许可 不得传播

 评论