找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 13654|回复: 94

[每日一码] 字符串分割--------------集中营

  [复制链接]

已领礼包: 604个

财富等级: 财运亨通

发表于 2013-8-12 10:50:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 /db_自贡黄明儒_ 于 2013-8-14 14:21 编辑

;;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
  )
)

游客,如果您要查看本帖隐藏内容请回复

;;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.11 [功能] 字符串分割 By wowan1314
;;(parse11 "aa   10 b10x20.2" " ");("aa" "" "" "10" "b10x20.2")
;;(parse11 "aa   10 b10x20.2" ""),死循环
(defun parse11 (str del / LST POS)
  (while
    (setq pos (vl-string-search del str))
     (setq lst (cons (substr str 1 pos) lst)
    str (substr str
         (+ 1 pos (strlen del))
        )
     )
  )
  (reverse (cons str lst))
)

parse.lsp

8.46 KB, 下载次数: 58

售价: 5 D豆  [记录]

为了让你心痛。什么心态?!

本帖被以下淘专辑推荐:

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2013-8-12 11:04:10 | 显示全部楼层
有个实例就好了
这么多的如何是好啊

点评

取一瓢饮  发表于 2013-8-12 12:08
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-8-12 11:30:05 | 显示全部楼层
楼主,试试,这些应该都可以用正则表达式改写下。

点评

有,集中营嘛  发表于 2013-8-12 15:08
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-8-12 11:35:01 | 显示全部楼层
一直用这个,可以是多字组成的分隔符
  1. (defun str-parse (str delimiter / post strlst strl)
  2.   (if str
  3.     (progn
  4.       (setq strlst '()
  5.      strl   (strlen delimiter)
  6.       )
  7.       (while (vl-string-search delimiter str)
  8. (setq post (vl-string-search delimiter str))
  9. (setq strlst (append strlst (list (substr str 1 post))))
  10. (setq str (substr str (+ post (1+ strl))))
  11.       )
  12.       (vl-remove "" (append strlst (list str)))
  13.     )
  14.   )
  15. )

_$ (str-parse "123sdsdsa123sdsdsa123" "sdsdsa")
("123" "123" "123")
_$ (str-parse "123好1的123好1的123" "好1的")
("123" "123" "123")
_$

点评

(str-parse "aa ,10 b.10x20,.2" "");死遁环  发表于 2013-8-12 12:03
;;基本同上parse4 parse8 ;;(parse12 "aa ,10 b.10x20,.2" ",."),("aa ,10 b.10x20" "2")  发表于 2013-8-12 12:01
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-8-12 12:23:11 | 显示全部楼层
奇怪!
_$ (str-parse "aa ,10 b.10x20,.2" "")
_1_$ (vl-string-search delimiter str)
0
_1_$ (vl-string-search "aa ,10 b.10x20,.2" "")
nil
_1_$

点评

(str-parse "aa ,10 b.10x20,.2" "")要写成(str-parse "aa ,10 b.10x20,.2" " ")才行  发表于 2013-8-12 12:45
我又试(str-parse "aa ,10 b.10x20,.2" "")了,还是死循环  详情 回复 发表于 2013-8-12 12:42
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2013-8-12 12:42:28 | 显示全部楼层
st788796 发表于 2013-8-12 12:23
奇怪!
_$ (str-parse "aa ,10 b.10x20,.2" "")
_1_$ (vl-string-search delimiter str)

我又试(str-parse "aa ,10 b.10x20,.2" "")了,还是死循环
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2963个

财富等级: 家财万贯

发表于 2013-8-12 14:55:00 | 显示全部楼层
为了学习好东西,努力回复
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-8-12 16:35:11 | 显示全部楼层
连拼带凑了一个VBS
  1. (defun str-split (string str / vbs ret)
  2.   (if (or
  3.         **ScriptControl**
  4.         (setq **ScriptControl** (vlax-create-object "ScriptControl"))
  5.       )
  6.     (progn
  7.       (vlax-put **ScriptControl** "Language" "VBS")
  8.       (setq vbs
  9.              (strcat "Dim ret\n"        "s = \""
  10.                      string                "\"\nsn = \""
  11.                      str                "\"\nret = Split(s,sn)"
  12.                     )
  13.       )
  14.       (vlax-invoke **ScriptControl** 'ExecuteStatement vbs)
  15.       (setq ret (vlax-invoke **ScriptControl** 'eval "ret"))
  16.     )
  17.   )
  18.   ret
  19. )

点评

你的这个同vbs正则表达式相比,有什么不同?  发表于 2013-8-13 08:14
你这个怎么用,举几个应该示例吧  详情 回复 发表于 2013-8-13 08:12

评分

参与人数 1D豆 +1 收起 理由
/db_自贡黄明儒_ + 1 有了你这个,才是真正的集中营了!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 221个

财富等级: 日进斗金

发表于 2013-8-13 06:53:05 | 显示全部楼层
不错,下来试试怎样,支持:)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

发表于 2013-8-13 06:57:06 | 显示全部楼层
这个要学,还不太明白!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 5604个

财富等级: 富甲天下

发表于 2013-8-13 07:53:15 | 显示全部楼层
黄大侠又出力作了,支持黄大侠!

点评

主要是收集总结一下而已  发表于 2013-8-15 08:38
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2013-8-13 08:12:23 | 显示全部楼层
st788796 发表于 2013-8-12 16:35
连拼带凑了一个VBS

你这个怎么用,举几个应该示例吧
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-8-13 08:42:07 来自手机 | 显示全部楼层

和上面的函数一样用法来自: Android客户端

点评

有介绍ScriptControl用法的资料吗?能否提供  详情 回复 发表于 2013-8-13 11:11
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2013-8-13 11:11:40 | 显示全部楼层
st788796 发表于 2013-8-13 08:42
和上面的函数一样用法

有介绍ScriptControl用法的资料吗?能否提供
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-8-13 11:37:50 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2013-8-13 11:11
有介绍ScriptControl用法的资料吗?能否提供


下载地址:晓东文库


评分

参与人数 1D豆 +1 收起 理由
/db_自贡黄明儒_ + 1 热心帮忙奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-22 22:28 , Processed in 0.472452 second(s), 73 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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