1. AutoLisp字符串处理基础入门第一次接触AutoLisp字符串处理时我完全被各种函数搞晕了。后来在实际项目中才发现掌握这些基础函数能极大提升开发效率。AutoLisp的字符串处理函数主要分为三类转换类、操作类和匹配类。转换类如ascii/chr负责字符与ASCII码转换操作类如strcat/substr用于字符串拼接和截取匹配类如wcmatch实现模式匹配。先说说最基础的ascii和chr这对函数。记得有次需要生成序列字母标签用(chr ( 65 index))就轻松实现了A-Z的自动生成。这对函数虽然简单但在处理字符编码时特别有用(ascii B) ;; 返回66 (chr 66) ;; 返回B新手常犯的错误是混淆字符和字符串。在AutoLisp中单字符B实际是长度为1的字符串。理解这点很重要因为后续所有字符串函数操作的都是字符串对象没有单独的字符类型。2. 字符串读取与转换实战2.1 read函数的妙用read函数远比表面看起来强大。它不仅能提取字符串中的第一个原子还能自动转换数据类型。我在处理用户输入时经常用它(read 123.45) ;; 返回123.45自动转为实数 (read (a b c)) ;; 返回表(A B C) (read \text\) ;; 返回text带引号的字符串但要注意陷阱read遇到空格会停止解析。有次我处理12 34只得到12后来改用字符串分割才解决。对于含空格的字符串需要先用其他方法处理。2.2 类型转换全家桶AutoLisp提供完整的类型转换链字符串转数字atof/atoi数字转字符串itoa/rtos特殊格式distof/angtof实际工程中最常用的是rtos它能控制小数位数和格式。我做CAD标注时这样用(rtos 3.1415926 2 3) ;; 返回3.142模式2小数精度3位模式参数很关键1-科学计数2-十进制3-工程单位4-建筑单位5-分数3. 字符串操作三剑客3.1 拼接大师strcatstrcat是我使用频率最高的函数之一。在生成动态SQL语句时特别有用(setq table users) (setq fields (id,name,age)) (setq sql (strcat SELECT fields FROM table)) ;; 返回SELECT (id,name,age) FROM users但要注意性能连续拼接多个字符串时最好先用list收集再apply strcat比多次调用strcat效率高30%以上。3.2 精准截取substrsubstr的索引从1开始这点很反直觉我因此踩过坑。典型用法(substr AutoLisp 1 4) ;; Auto从第1字符取4个 (substr AutoLisp 5) ;; Lisp从第5到结尾我常用它解析文件路径(setq path C:/Projects/test.dwg) (setq ext (substr path (- (strlen path) 3))) ;; 获取扩展名.dwg3.3 大小写转换strcasestrcase的第二个参数容易被忽略。做不区分大小写比较时我会(equal (strcase str1) (strcase str2)) ;; 全转大写比较或者更优雅的方式(equal (strcase str1 T) (strcase str2 T)) ;; 全转小写比较4. 高级模式匹配技巧4.1 通配符大师wcmatchwcmatch的通配符比正则简单但够用。处理文件名时我这样用(wcmatch test123.txt *.txt) ;; T (wcmatch test123.txt test???.txt) ;; T (wcmatch test123.txt test[0-9]*.txt) ;; T复杂匹配可以用逗号分隔多个模式(wcmatch error.log *.txt,*.log) ;; 匹配txt或log4.2 转义字符处理当需要匹配特殊字符时单引号转义很关键(wcmatch price$100 *$*) ;; 检查是否包含$注意转义字符本身也需要转义(wcmatch a\\b *\\*) ;; 检查是否包含反斜杠5. 工程实用案例解析5.1 CAD标注自动化结合rtos和strcat实现智能标注(defun smart-dimension (value) (strcat (rtos value 2 2) mm))5.2 配置文件解析用read和wcmatch解析INI文件(while (setq line (read-line fp)) (if (wcmatch line [*]) (setq section (substr line 2 (- (strlen line) 2)))))5.3 批量重命名工具综合运用字符串函数(foreach name name-list (setq newname (strcat prefix (substr name 4))) (rename-file name newname))6. 性能优化与调试字符串处理最容易出现性能瓶颈。我的经验避免在循环内反复调用strcat大量操作时使用vl-string-translate替代多个substr预编译常用模式字符串调试字符串问题时我习惯用print输出中间结果(print (strcat Debug: var)) ;; 查看拼接结果7. 特殊场景处理7.1 多语言字符处理AutoLisp对Unicode支持有限处理中文时要注意(strlen 中文) ;; 可能返回4取决于编码7.2 大字符串处理超过500字符的字符串需要分段处理特别是wcmatch函数有长度限制。8. 最佳实践总结经过多年实践我总结出字符串处理的黄金法则始终检查输入是否为nil使用(strlen)判断空字符串比( str )更可靠复杂操作分解为多个简单步骤为常用操作编写工具函数例如安全的字符串转换(defun safe-atoi (str) (if (and str (wcmatch str #*)) (atoi str) 0))