明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 44969|回复: 205

[源码] 字符串分割-----------集中营

  [复制链接]
发表于 2013-8-12 10:51 | 显示全部楼层 |阅读模式
本帖最后由 自贡黄明儒 于 2013-8-14 14:39 编辑

;;85.1 [功能] 字符串分割
;;http://www.mjtd.com/function/info-129-216.html,有修改 黄明儒 2013年8月9日
;;(setq str   "100,,23456.876,345.456," delim ",")
(defun parse1 (str delim / LST POS)
  (while (setq pos (vl-string-search delim str))
    (setq lst (cons (substr str 1 pos) lst)
          str (substr str (+ pos 2))
    )
  )
  (if (> (strlen str) 0)
    (setq lst (cons str lst))
  )
  (reverse lst)
)
;;85.2 [功能] 字符串分割
;;http://www.mjtd.com/function/info-129-444.html,修改xl:read->biao  黄明儒 2013年8月9日
(defun parse2 (str delim / LST POS)
  (while (setq pos (vl-string-search delim str))
    (setq lst (append lst (list (substr str 1 pos))))
    (setq str (substr str (+ 2 pos)))
  )
  (if (> (strlen str) 0)
    (append lst (list str))
    lst
  )
)

;|
;;http://www.xdcad.net/forum/thread-669166-1-2.html By XDSoft
功能 对字符串进行正则表达式匹配测试.
pat = 正则表达式模式 ,对应vbs正则表达式的模式(expression)。说明: \\号要用\\\\替代.
str = 字符串
key = \"i\" \"g\" \"m\" , \"i\"不区分大小写(Ignorecase),\"g\"全局匹配(Global).
           \"m\"多行模式(Multiline),以上几个关键字可以组合使用,或用 \"\".
返回: 返回匹配的字符列表,或无一匹配返回nil
|;
(defun XD::String:RegExpS (pat str key / end keys matches x)
  (if (not *xxvbsexp)
    (setq *xxvbsexp (vlax-get-or-create-object "VBScript.RegExp"))
  )
  (vlax-put *xxvbsexp 'Pattern pat)
  (if (not key)
    (setq key "")
  )
  (setq key (strcase key))
  (setq        keys '(("I" "IgnoreCase")
               ("G" "Global")
               ("M" "Multiline")
              )
  )
  (mapcar
    '(lambda (x)
       (if (wcmatch key (strcat "*" (car x) "*"))
         (vlax-put *xxvbsexp (read (cadr x)) 0)
         (vlax-put *xxvbsexp (read (cadr x)) -1)
       )
     )
    keys
  )
  (setq matches (vlax-invoke *xxvbsexp 'Execute str))
  (vlax-for x matches (setq end (cons (vla-get-value x) end)))
  (reverse end)
)
;;85.3 [功能] 字符串分割 By st788796
;;这是一个很万能的分割法,只不过delim写法复杂
;;示例:,分割(parse3 "A 3.2测,试5.66D" "[^,]+");;("A 3.2测" "试5.66D")
;;空格分割(parse3 "A 3.2测,试5.66D" "[^\\s]+");;("A" "3.2测,试5.66D")
;;中英文空格(parse3 "A 3.2测,试5.66D" "[\\u4E00-\\u9FA5]+|[^\\u4E00-\\u9FA5/ ]+|[\\s]+");;("A" " " "3.2" "测" "," "试" "5.66D")
;;中文(parse3 "A 3.2测,试5.66D" "[\\u4E00-\\u9FA5]+");;("测" "试")
;;英文(parse3 "A 3.2测,试5.66D" "[^\\u4E00-\\u9FA5]+");;("A 3.2" "," "5.66D")
(defun parse3 (str delim)
  (xd::string:regexps delim str "")
)
;;85.4 [功能] 字符串分割
;;这是一个很牛的分割法(基本同parse8),容易理解
;;delim是一个字符串集合,其中的每一个字符都会被当作是分割符号 by qjchen@gmail.com
;;如 (parse4 "符号25 35 45 ; 55, 66 " " ;")=> ("25" "35" "45" "55," "66")
;;(parse4 "aa ,10 b.10x20,.2" ",.")("aa " "10 b" "10x20" "2")
(defun parse4 (str delim / L1 L2)
  (setq        str   (vl-string->list str)
        delim (vl-string->list delim)
  )
  (while str
    (if        (not (member (car str) delim))
      (setq l1 (cons (car str) l1))
      (if l1
        (setq l2 (cons (vl-list->string (reverse l1)) l2)
              l1 nil
        )
      )
    )
    (setq str (cdr str))
  )
  (if l1
    (setq l2 (cons (vl-list->string (reverse l1)) l2))
  )
  (reverse l2)
)
;;85.5 [功能] 字符串分割(这highflybird回答我的求助,简洁)
;;(parse5 "aa 10 b10x20.2" "")返回("AA" "10" "B10X20")
;;(parse5 "aa 10 b10x20.2" ".")返回("AA" "10" "B10X20" "2")
(defun parse5 (String Delimiter / str lst)
  ;;替换成空格,为后面转化作准备,问题是如果字符中原来就有空格
  (setq str (VL-STRING-TRANSLATE Delimiter " " String))
  (setq str (strcat "(" str ")"))                  ;加括号
  (setq lst (read str))                                  ;读
  (mapcar 'VL-PRINC-TO-STRING lst)                  ;转化
)
;;85.6 [功能] 用分隔符解释字符串成表 ;by fsxm
;;空格" ",不能用"" ,一个空格就转成一个字符
;;(parse6 "aa   10 b10x20.2" " ")返回("aa" "" "" "10" "b10x20.2")
;;(parse6 "aa   10 b10x20.2" "")死循环
(defun parse6 (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))
    (setq string (substr string (+ po xlen)))
  )
  (reverse (cons string strlst))
)
;;85.7 [功能] 字符串分割 黄明儒 2013年8月9日
;;改自梁雄啸str2lst1;同parse5,也parse6一样,空格不能有""替代
;;(parse7 "aa   10 b10x20.2" " ");("aa" "" "" "10" "b10x20.2")
;;(parse7 "aa   10 b10x20.2" "")死循环
;;(parse7 "aa 10 b10x20.2" " ")("aa" "10" "b10x20.2")与parse5不同,不会去掉.2
;;(parse7 "aa 10 b10x20.2" "x")("aa 10 b10" "20.2")
(defun parse7 (str delim / I)
  (while (setq i (vl-string-search
                   delim
                   str
                   (if i
                     (+ 2 i)
                     0
                   )
                 )
         )
    (setq str (vl-string-subst "\"\"" delim str i))
  )
  (read (strcat "(\"" str "\")"))
)
;;85.8 [功能] 字符串分割(基本同parse4)
;;改自梁雄啸str2lst2 黄明儒 2013年8月9日
;;(parse8 "aa ,10 b.10x20,.2" ",.")("aa " "10 b" "10x20" "" "2")
;;(vl-list->string '(40));"("
;;(vl-list->string '(34)),"\""
;;(vl-list->string '(32))," "
(defun parse8 (str delim / DELIM X)
  (setq delim (vl-string->list delim))
  (read
    (vl-list->string
      (apply
        'append
        (mapcar        '(lambda (x)
                   (if (member x delim)
                     (list 34 32 34)                  
                     (list x)
                   )
                 )
                (append (list 40 34) (vl-string->list str) (list 34 41))
        )
      )
    )
  )
)
;;85.9  [功能] 字符串分割 (纯lisp法)
;;改自梁雄啸str2lst3 黄明儒 2013年8月9日
;;(parse9 "aa   10 b10x20.2" " ");("aa" "" "" "10" "b10x20.2")
;;(parse9 "aa   10 b10x20.2" ""),没作用,但不进入死循环
(defun parse9 (str delim / I S STR1 STRLST)
  (setq        i 0
        str1 ""
  )
  (while (/= "" (setq s (substr str (setq i (1+ i)) 1)))
    (cond ((/= delim s) (setq str1 (strcat str1 s)))
          (T
           (setq strlst        (append strlst (list str1))
                 str1        ""
           )
          )
    )
  )
  (if (/= str1 "")
    (append strlst (list str1))
    strlst
  )
)
;;85.10 [功能] 字符串分割(纯lisp法)
;;改自梁雄啸str2lst 黄明儒 2013年8月9日
;;(parse10 "aa   10 b10x20.2" " ");("aa" "" "" "10" "b10x20.2")
;;(parse10 "aa   10 b10x20.2" ""),没作用,但不进入死循环
(defun parse10 (str delim / I S STR1)
  (setq        i 0
        str1 ""
  )
  (while (/= "" (setq s (substr str (setq i (1+ i)) 1)))
    (setq str1 (strcat str1
                       (if (= delim s)
                         "\" \""
                         s
                       )
               )
    )
  )
  (read (strcat "(\"" str1 "\")"))
)
;;85.12 [功能] 字符串分割 By st788796
;;基本同上parse4 parse8
;;(parse12 "aa ,10 b.10x20,.2" ",."),("aa ,10 b.10x20" "2")
;;(parse12 "aa ,10 b.10x20,.2" "")死循环
(defun parse12 (str delimiter / POST STRL STRLST)
  (setq strl (strlen delimiter))
  (while (vl-string-search delimiter str)
    (setq post (vl-string-search delimiter str))
    (setq strlst (append strlst (list (substr str 1 post))))
    (setq str (substr str (+ post (1+ strl))))
  )
  (vl-remove "" (append strlst (list str)))
)

本帖子中包含更多资源

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

x

评分

参与人数 4明经币 +4 收起 理由
tigcat + 1 很给力!
lostbalance + 1 XD::String:RegExpS,这个函数用I做key的时.
品茗新秀 + 1 很给力!
pzweng + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

发表于 2013-8-12 10:59 | 显示全部楼层
差不多!
  1. ;按分隔符分解字符串成表.
  2. (defun t11 (str del / pos lst)
  3.     (while
  4.         (setq pos (vl-string-search del str))
  5.         (setq lst (cons (substr str 1 pos) lst)
  6.             str (substr str (+ 1 pos (strlen del))
  7.             )
  8.         )
  9.     )
  10.     (reverse(cons str lst))
  11. )

点评

(t11 "aa 10 b10x20.2" " ");("aa" "" "" "10" "b10x20.2")  发表于 2013-8-12 11:54
(t11 "aa 10 b10x20.2" ""),死循环  发表于 2013-8-12 11:53
回复 支持 1 反对 0

使用道具 举报

发表于 2022-9-9 10:26 | 显示全部楼层
  1. (defun split2 (str sp / str1)
  2.   (cond
  3.     ((= str nil) nil)
  4.     ((= sp nil) nil)
  5.     ((= str "") "")
  6.     ((= sp "") str)
  7.     (t
  8.      (setq str1 (strcat "((\"" str "\"))"))
  9.      (while (vl-string-search sp str1)
  10.        (setq str1 (vl-string-subst "\")(\"" sp str1))
  11.      )
  12.      (apply 'append (read str1))
  13.     )
  14.   )
  15. )
发表于 2018-8-14 16:03 | 显示全部楼层

真心看不懂,太复杂了  
发表于 2013-8-12 10:52 | 显示全部楼层
哦,感谢黄兄,收集的这么全,谢谢了
发表于 2013-8-12 10:56 | 显示全部楼层
支持
发表于 2013-8-12 11:06 | 显示全部楼层
先占个沙发,感谢黄工!
发表于 2013-8-12 15:09 | 显示全部楼层
看看,学习下
发表于 2013-8-12 15:42 | 显示全部楼层
牛啊,收集的不少啊
发表于 2013-8-12 18:29 | 显示全部楼层
感谢黄老师!
发表于 2013-8-12 20:13 | 显示全部楼层
看看,参考学习
发表于 2013-8-12 21:07 | 显示全部楼层
楼主辛苦了,希望能再整理些好东西

点评

真心看不懂,太复杂了  发表于 2014-10-20 03:20
很高兴版主捧场,我会努力的  发表于 2013-8-15 08:03
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-29 06:21 , Processed in 0.190570 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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