明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 519|回复: 8

[经验] 【源码】指定字符分割字符串

[复制链接]
发表于 2024-5-25 10:03 | 显示全部楼层 |阅读模式
本帖最后由 13816600495 于 2024-5-25 10:11 编辑

  1. (defun cl-string-split (str string / m n f n1 n2 list1 list2 list3 list4 lst)
  2.   (setq list1 (vl-string->list str) n1 (length list1) list2 (vl-string->list string) n2 (length list2) n 0 tt t)
  3.   (while (nth n list2)
  4.     (setq lst nil m (1- n))
  5.     (repeat n1
  6.       (setq lst (cons (nth (setq m (1+ m)) list2) lst))
  7.     )
  8.     (if (not (equal list1 (reverse lst)))
  9.       (progn
  10.         (setq list3 (cons (nth n list2) list3))
  11.         (setq n (1+ n))
  12.       )
  13.       (progn   
  14.         (if (= n 0) (setq list4 (cons "" list4)))
  15.         (if (and f (= (- n f) n1)) (setq list4 (cons "" list4)))
  16.         (setq f n n (+ n n1))
  17.         (if list3 (setq list4 (cons (vl-list->string (reverse list3)) list4) list3 nil))
  18.         (if (not (nth n list2)) (setq list4 (cons "" list4)))
  19.       )
  20.     )
  21.   )
  22.   (if list3 (setq list4 (cons (vl-list->string (reverse list3)) list4)))
  23.   (reverse list4)
  24. )

->用法:
输入:str--指定的字符串
输入:string--要分割的字符串

->用法举例:
(defun c:pp ()
    (cl-string-split "--" "日期--2023--05--24")
)

->返回: ("日期" "2023" "05" "24")


"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2024-5-25 21:33 | 显示全部楼层
  1.    (DEFUN STR2LST (STR DEL / POS)
  2.       (if (setq POS (VL-STRING-SEARCH DEL STR))
  3.         (PROGN (CONS (SUBSTR STR 1 POS) (STR2LST (SUBSTR STR (+ POS 1 (STRLEN DEL))) DEL)))
  4.         (PROGN (LIST STR))
  5.       )
  6.     )

  7. (STR2LST "日期--2023--05--24" "--")

  8. ->返回: ("日期" "2023" "05" "24")

评分

参与人数 1明经币 +1 收起 理由
13816600495 + 1 很给力!

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2024-5-25 10:30 | 显示全部楼层
找到以前别人的
(defun ko->str-symlst (string strkey / po strlst xlen)
(setq xlen (1+ (strlen strkey)))
(while (setq po (vl-string-search strkey string))
(setq strlst (cons (substr string 1 po) strlst) string (substr string (+ po xlen))))
(reverse (cons string strlst)))

(ko->str-symlst "日期--2023--05--24" "--")

->返回: ("日期" "2023" "05" "24")
发表于 2024-5-25 10:30 | 显示全部楼层
;;;分割字串
  (defun gxl-StrParse (str del / pos lst)
    (while (setq pos (vl-string-search del str))
      (setq lst        (cons (substr str 1 pos) lst)
            str        (substr str (+ pos 1 (strlen del)))
      )
    )
    (if        (= " " Del)
      (vl-remove "" (reverse (cons str lst)))
      (reverse (cons str lst))
    )
  )
发表于 2024-5-25 10:36 | 显示全部楼层
写的太啰嗦了
发表于 2024-5-25 14:35 | 显示全部楼层
字符串之所以叫字符串,其实它是字符组合成的数组,结果lisp要反向切割...
发表于 2024-5-26 09:37 | 显示全部楼层
增强型字串分割处理
http://bbs.mjtd.com/forum.php?mo ... &fromuid=202795
(出处: 明经CAD社区)

  1. (defun strsplit(str splits / i a b)
  2.   (while(<""str)
  3.     (if(vl-remove'nil(mapcar'(lambda(x)(vl-string-search x str))splits))
  4.       (setq i(car(vl-sort(vl-remove'nil(mapcar'(lambda(x)(if(setq l(vl-string-search x str))(cons l x)))splits))
  5.        '(lambda(s1 s2)(<(car s1)(car s2)))))
  6.       a(cons(substr str 1(car i))a)b(cons(cdr i)b)
  7.       str(substr str(+(car i)(strlen(cdr i))1)))
  8.       (setq a(cons str a)b(cons "" b)str"")))
  9.   (list(reverse a)(reverse b)))

(STRSPLIT "12+34分隔35-454,22,33-45" '("+""-""*"","";"" ""=""分隔"))
==>(("12" "34" "35" "454" "22" "33" "45") ("+" "分隔" "-" "," "," "-" ""))
 楼主| 发表于 2024-5-26 10:44 | 显示全部楼层
终于把大神都钓出来了
发表于 2024-5-27 15:59 | 显示全部楼层

递归用的妙啊,这个代码太简洁了!学习了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-6-17 15:26 , Processed in 0.164850 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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