ollie 发表于 2022-7-6 14:20:20

通配符选择集

大家好
 
我工作中的一位工作人员向我询问一种计算以特定层上的字符开头的字符串实例数的方法
 
这让我产生了以下想法,我觉得社区可能会发现这些想法很有用
 

(setq sset (ssget "X" (list(cons 1 "A*")(cons 8 "Exlayer"))))

 
asterix(*)允许对实体进行通配符过滤。
 
这也适用于搜索中间字符串的*char*
 
奥利

Lee Mac 发表于 2022-7-6 14:31:05

谢谢分享,奥利,
 
另一种方法:
 

(defun c:tcnt(/ ss tStr)
(vl-load-com)
(if (and (setq ss (ssget "_X" (list (cons 0 "*TEXT"))))
          (setq tStr (getstring t "\nText to Search For: ")))
   (progn
   (setq ss (vl-remove-if-not
                (function
                  (lambda (x)
                  (wcmatch
                      (cdr (assoc 1 (entget x))) tStr)))
            (mapcar 'cadr (ssnamex ss))))
   (if (not (zerop (length ss)))
       (princ (strcat (rtos (length ss) 2 0) " Item(s) Found."))
       (princ "\nNo Matching Text Strings. ")))
   (princ "\n<!> No Text Found in Drawing <!>"))
(princ))

ollie 发表于 2022-7-6 14:34:00

 
毫无疑问,回馈社区换换口味是件好事
 
值得一提。其中,我将“A*”作为文字字符串,可以使用变量
 
奥利

Lee Mac 发表于 2022-7-6 14:41:18

请记住,所有通配符都适用于此,因此对于包含数字的文本字符串,可以使用“*#*”。
 
一个很好的例子:
 
http://www.cadtutor.net/forum/showpost.php?p=72097&postcount=8

ollie 发表于 2022-7-6 14:44:44

 
这太可怕了。它的工作方式是否与PERL的正则表达式类似?

Lee Mac 发表于 2022-7-6 14:49:56

 
我不能肯定这一点,但通配符是相当标准的。

CAB 发表于 2022-7-6 14:56:36

奥利,
注意,您的示例区分大小写。要使其不区分大小写,请使用以下选项:
(setq sset (ssget "X" (list(cons 1 "*")(cons 8 "Exlayer"))))

CAB 发表于 2022-7-6 15:02:16

有关ssget中wcmatch的另一个示例,请参阅Evgeniy的这个示例
在这里,我解释了它的工作原理:
http://www.theswamp.org/index.php?topic=21058.msg255696#msg255696
 
他精通通配符的用法。

ollie 发表于 2022-7-6 15:08:47

 
谢谢你,出租车
 
我有机会使用通配符系统,它或多或少是perl的正则表达式。
 
*将查找asdf,但不查找asdf(匹配类[]中的字符0次或更多次
 
到目前为止,我注意到的唯一主要区别是“\”字符(如\w、\d)不起作用
 
奥利

Lee Mac 发表于 2022-7-6 15:09:53

 
很好的例子Alan
页: [1] 2
查看完整版本: 通配符选择集