找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 143|回复: 2

[研讨] AutoLISP 中的 wcmatch 函数与 pattern 详解

[复制链接]

已领礼包: 20个

财富等级: 恭喜发财

发表于 2025-4-7 11:39:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
AutoLISP 中的 wcmatch 函数与 pattern 详解
wcmatch 是 AutoLISP 中用于字符串模式匹配的函数,类似于其他编程语言中的正则表达式,但语法更简单。它使用 通配符(wild-card characters) 来定义匹配规则。

1. wcmatch 函数的基本语法
(wcmatch "str" "pattern")
  • str:要匹配的字符串(可以是变量或直接字符串)。
  • pattern:匹配模式(支持通配符)。
  • 返回值

    • 如果 str 符合 pattern,返回 T(真)。
    • 否则返回 nil(假)。

2. 通配符(Wild-card Characters)
通配符
含义
示例
匹配示例
#
匹配 任意一个数字(0-9)"A##""A12"(匹配),"AB3"(不匹配)
@
匹配 任意一个字母(A-Z, a-z)"A@@""ABc"(匹配),"A12"(不匹配)
.
匹配 任意一个非字母数字字符"A.3""A#3"(匹配),"AA3"(不匹配)
*
匹配 任意长度的字符(包括空字符串)"A*""A", "ABC", "A123"(均匹配)
?
匹配 任意一个字符"A?C""ABC", "A1C"(匹配),"AC"(不匹配)
~
否定匹配(必须放在模式开头)"~A*"匹配 不以 A 开头 的字符串
[abc]
匹配 括号内的任意一个字符"[ABC]1""A1", "B1", "C1"(匹配)
[~abc]
匹配 不在括号内的任意一个字符"[~ABC]1""D1"(匹配),"A1"(不匹配)
[a-z]
匹配 范围内的任意一个字符"[A-Z]1""A1", "B1"(匹配),"a1"(不匹配)
,
多个模式组合(逻辑“或”)"A*,B*""ABC"(匹配 A*),"BCD"(匹配 B*)
`
转义字符(取消通配符的特殊含义)"*\*"`匹配包含 \ 的字符串

3. 关键注意事项(1) 转义特殊字符
  • 如果要匹配 *, ?, # 等通配符本身,需要用反引号 ` 转义:

    (wcmatch "A*B" "A`*B")  ; 匹配 "A*B"
  • 匹配 ,(逗号):

    (wcmatch "A,B" "A`,B")  ; 匹配 "A,B"
  • 匹配 \(反斜杠):

    (wcmatch "A\\B" "A`\\B")  ; 匹配 "A\B"


(2) 范围匹配 [a-z]
  • 只能匹配 单个字符

    (wcmatch "ABC" "[A-Z][A-Z][A-Z]")  ; 匹配 "ABC"(wcmatch "A1C" "[A-Z]#[A-Z]")     ; 匹配 "A1C"

  • [1-38] 并不是 1 到 38,而是 1, 2, 3, 8

    (wcmatch "STR1" "STR[1-38]")  ; 匹配 "STR1", "STR2", "STR3", "STR8"


(3) ~ 必须放在模式开头

(wcmatch "ABC" "~A*")  ; 匹配 **不以 A 开头** 的字符串(wcmatch "XYZ" "~A*")  ; 返回 T(wcmatch "ABC" "~A*")  ; 返回 nil


(4) 多个模式用 , 分隔

(wcmatch "ABC" "A*,B*")  ; 匹配以 A 或 B 开头的字符串(wcmatch "BCD" "A*,B*")  ; 匹配,因为符合 B*


4. 经典示例
示例
含义
匹配情况
(wcmatch "ABC" "A*")
匹配以 A 开头的字符串"ABC", "A123"(匹配)
(wcmatch "123" "#*")
匹配以数字开头的字符串"123", "1A"(匹配)
(wcmatch "A1B" "A?B")
匹配 A + 任意字符 + B"A1B", "AXB"(匹配)
(wcmatch "A,B" "A,B")`
匹配 A,B(逗号被转义)"A,B"(匹配)
(wcmatch "STR1" "STR[1-3]")
匹配 STR1, STR2, STR3"STR1"(匹配)
(wcmatch "XYZ" "[~ABC]*")
匹配 不以 A/B/C 开头 的字符串"XYZ"(匹配)

5. 总结
  • wcmatch 是 AutoLISP 中强大的字符串匹配函数,适用于文件名、图层名等筛选。
  • 通配符

    • * 任意长度字符
    • ? 单个字符
    • # 数字
    • @ 字母
    • ~ 否定匹配

  • 转义字符 ` 用于匹配特殊符号(如 *, ?, ,, \)。
  • 范围匹配 [a-z] 只能匹配 单个字符
  • 多个模式用 , 分隔,实现“或”逻辑。

掌握 wcmatch 可以极大提高 AutoLISP 字符串处理的灵活性!



论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 21个

财富等级: 恭喜发财

发表于 2025-4-7 15:32:24 | 显示全部楼层
精典资料,谢谢分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 4个

财富等级: 恭喜发财

发表于 2025-4-18 22:22:29 | 显示全部楼层
谢谢大佬分享,,学习了.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-4-28 09:49 , Processed in 0.430551 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表