明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 707|回复: 3

【K:ExplodeSTR】将字符串拆分成单字符列表

[复制链接]
发表于 2023-6-17 10:01 | 显示全部楼层 |阅读模式

看到坛友在讨论拆分字符串,提供一个另类的拆分函数。
主要用在我另外两个帖子中的程序:DZ和FA
  1. ;将字符串拆分成单字符列表
  2. (defun K:ExplodeSTR (STR / Defined STRDefined RtnSTR Pos)
  3.   (setq Defined
  4.       (List
  5.         "%%130" "%%131" "%%132" "%%133" "%%134" ;1~4级钢筋符号+特殊钢筋
  6.         "%%135" "%%136" "%%137" "%%138" ;L型钢+H型钢+槽型钢+工字钢
  7.         "%%150" "%%151" "%%152" "%%153" "%%154" "%%155" "%%156" "%%157" "%%158" "%%159" ;罗马数字
  8.         "%%177" "%%p" "%%P" ;正负号
  9.         "%%c" "%%C" "%%D" "%%d" "%%%";直径符号+度数符号+%
  10.         '("%%140" "%%141") '("%%142" "%%143") ;上下标开关
  11.         '("%%200" "%%201") '("%%202" "%%203") '("%%204" "%%205") ;圆圈数字
  12.       )
  13.   )
  14.   (while (> (strlen STR) 0)
  15.     (cond
  16.       ((setq STRDefined
  17.           (vl-some
  18.             '(lambda (Sub / STRDefined)
  19.               (setq STRDefined (if (listp Sub) (car Sub) Sub))
  20.               (if (eq (substr STR 1 (strlen STRDefined)) STRDefined) Sub)
  21.             )
  22.             Defined
  23.           )
  24.         )
  25.         (if (listp STRDefined)
  26.             (if (setq Pos (vl-string-search (cadr STRDefined) STR))
  27.               (progn
  28.                 (setq RtnSTR (cons (substr STR 1 (+ Pos (strlen (cadr STRDefined)))) RtnSTR))
  29.                 (setq STR (substr STR (+ 1 Pos (strlen (cadr STRDefined)))))
  30.               )
  31.               (progn
  32.                 (setq RtnSTR (cons STR RtnSTR))
  33.                 (setq STR "");清空
  34.               )
  35.             )
  36.             (progn
  37.               (setq RtnSTR (cons STRDefined RtnSTR))
  38.               (setq STR (substr STR (1+ (strlen STRDefined))))
  39.             )
  40.         )
  41.       )
  42.       ((> (ascii (substr STR 1 1)) 128) ;大于128为汉字
  43.         (if
  44.           (and
  45.             (>= (atoi (substr (ver) 13)) 2021)
  46.             (/= (getvar "lispsys") 0)
  47.           )
  48.           (progn
  49.             (setq RtnSTR (cons (substr STR 1 1) RtnSTR))
  50.             (setq STR (substr STR 2))
  51.           )
  52.           (progn
  53.             (setq RtnSTR (cons (substr STR 1 2) RtnSTR))
  54.             (setq STR (substr STR 3))
  55.           )
  56.         )
  57.       )
  58.       (T
  59.         (setq RtnSTR (cons (substr STR 1 1) RtnSTR))
  60.         (setq STR (substr STR 2))
  61.       )
  62.     )
  63.   )
  64.   (reverse RtnSTR)
  65. )

发表于 2024-2-2 22:57 | 显示全部楼层
  • ;;将字符串拆解成单字列表-------(一级)--------(sl_text:stringexplode "12我 的\n三领设计")
  • ;str_Given        需要转换的字符串
  • ;b_Find            是否找到特殊字符串
  • ;str_Defined      特殊字符串
  • ;i_Length          特殊字符串 长度
  • ;lst_Return       返回字符串列表
  • (defun sl_text:stringexplode (str_given / strlst_def strlst_def2 b_find  str_defined  i_length lst_return e strlst-tmp)
  •   (setq strlst_Def (str->lst "%%130|%%131|%%132|%%133|%%134|%%135|%%136|%%p|%%P|%%c|%%C" "|")) ;单定义字符
  •   (setq strlst_Def2 (mapcar '(lambda (e) (str->lst e "*")) (str->lst "%%140*%%141|%%142*%%143|%%200*%%201|%%202*%%203|%%204*%%205" "|")));成对定义字符
  •   ;(("%%140" "%%141") ("%%142" "%%143") ("%%200" "%%201") ("%%202" "%%203") ("%%204" "%%205"))
  •   (while (> (strlen str_given) 0);检查单字符串是否在特殊字符串列表中
  •     (setq b_find nil)
  •     ;检查 单定义字符
  •     (setq strlst-tmp strlst_def)
  •     (while (and strlst-tmp (not b_find))
  •       (setq str_defined (car strlst-tmp))
  •       (setq i_length (strlen str_defined))
  •       (if (= (substr str_given 1 i_length) str_defined)
  •         (setq b_find t)
  •       )
  •       (setq strlst-tmp (cdr strlst-tmp))
  •     )
  •     (setq strlst-tmp strlst_def2) ;检查 成对定义字符
  •     (while (and strlst-tmp (not b_find))
  •       (setq str_defined (caar strlst-tmp))
  •       (setq i_length (strlen str_defined))
  •       (if (= (substr str_given 1 i_length) str_defined)
  •         (setq b_find t str_defined (car strlst-tmp))
  •       )
  •       (setq strlst-tmp (cdr strlst-tmp))
  •     )
  •     (cond
  •       (b_find  ;特殊字符串
  •         (if (equal (type str_defined) 'str)
  •           (setq lst_return (cons str_defined lst_return)
  •             str_given (substr str_given (1+ i_length))
  •           )
  •           (if (setq i (vl-string-search (cadr str_defined) str_given))
  •             (setq e (substr str_given 1 (+ i (strlen (cadr str_defined))))
  •               lst_return (cons e lst_return)
  •               str_given (substr str_given (+ 1 i (strlen (cadr str_defined))))
  •             )
  •             (setq lst_return (cons (car str_defined) lst_return)
  •               str_given (substr str_given (1+ i_length))
  •             )
  •           )
  •         )
  •       )
  •       ((> (ascii (substr str_given 1 1)) 128)  ;大于128为汉字
  •         (setq lst_return (cons (substr str_given 1 2) lst_return))
  •         (setq str_given (substr str_given 3))
  •       )
  •       (t
  •         (setq lst_return (cons (substr str_given 1 1) lst_return))
  •         (setq str_given (substr str_given 2))
  •       )
  •     )
  •   )
  •   (reverse lst_return)
  • )

点评

有什么更新改变吗?  发表于 2024-2-3 09:11
回复 支持 1 反对 0

使用道具 举报

发表于 2023-6-17 10:24 | 显示全部楼层
感谢分享,学习下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-5 14:35 , Processed in 1.027984 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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