找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: netbee

[群策群力] 字符串列表->数字列表

[复制链接]
发表于 2004-4-29 23:51:51 | 显示全部楼层
我删除并不是因为觉得处理\"有困惑,而是对逗号的处理犯了个低级错误。我把跳过符号` 写成‘了,没有得到应有的结果,而14贴已经正确的使用了 `,来处理,号。因此原来那贴也没什么必要了。
至于\",谢谢你帮完善,不过我自己觉得程序后面用mapcar那句有些感觉不好,就象我觉得你写的那个程序用了过多的reverse显得罗嗦,感觉不好一样:),所以没有继续那个程序,就从新另外写了一个。

mapcar那句之所以感觉不好,是因为原来不想用表的方法来处理。但mapcar是典型的表处理函数,因此有违初衷,看上去有点扎眼。不用mapcar也不是没有办法解决,只要在strcat的时候加个控制开关,用setq解决。

下面是后来从新写的:
[php]
; 字符串分段转表----by 陌生人.2004.4
(defun str2lst (str pat / i str1 s lst)
  (setq i 0)
  (repeat (1+ (strlen str))
    (setq s (substr str (setq i (+ i 1)) 1))
    (if (or (= "" s)(wcmatch s pat))
      (setq str1 (substr str 1 (1- i))
            str  (substr str (1+ i))
            i 0
         lst  (if (/= "" str1)(append lst (list str1)) lst)
      )
    )
  )lst
)
[/php]
(str2lst "(tt \"aa\" 1 \"(34cc)\")" "[()], ") -> ("tt" "\"aa\"" "1" "\"" "34cc" "\"")

再来一个》》
做为投桃报李,我也把你的用表的方法加强了一下。让pat支持通用的格式
[php]
(defun cut (str pat / lst n strl lst2)
  (setq lst (mapcar '(lambda(x) (if (wcmatch (chr x) pat) nil x))(vl-string->list str)))
  (foreach n (append lst (list nil))
    (if (= nil n)
        (setq strl (if lst2 (append strl (list lst2)) strl)
              lst2 '())
        (setq lst2 (append lst2 (list n)))
    )
  )
  (mapcar '(lambda(x)(vl-list->string x)) strl)
)
[/php]
(cut "(tt \"aa\" 1 \"(34cc)\")" "[()], ") -> ("tt" "\"aa\"" "1" "\"" "34cc" "\"")
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2004-4-30 22:56:55 | 显示全部楼层
那不就又回去了吗!

我用reverse是因为cons比append快的多。前面有讨论.
我相信如果很多东西要处理,会快一点。

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

使用道具 举报

发表于 2004-4-30 23:32:10 | 显示全部楼层
怎么会一样呢。要么干嘛要“通配符”
. #@[~..] [a-c]  
;过滤(),",空格及字母:
(str2lst " tt144G \"a341a\" 1 \"(34c2cD4)\"" "[() ],\",@")
-> ("144" "341" "1" "34" "2" "4")
这些就不是 转表然后member能轻松做到的了。你不是推崇“通用函数”么?现在怎么“又回去”了呢?

对多个字符也可以编程,如 pattern = "ab,123,#", 只要修改一下下:)呵呵,等大家来做了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2004-5-1 15:15:58 | 显示全部楼层
16贴str2lst -->1.24秒
16贴下面-->5.08秒 (append ??)
15贴 -->0.64秒   
  9贴 -->0.7秒
下面 1.2秒把你的改一下
  1. ;;append-->cond
  2. (defun str2lst2 (str pat / i str1 s lst)
  3.   (setq i 0)
  4.   (repeat (1+ (strlen str))
  5.     (setq s (substr str (setq i (+ i 1)) 1))
  6.     (if (or (= "" s)(wcmatch s pat))
  7.       (setq str1 (substr str 1 (1- i))
  8.         str  (substr str (1+ i))
  9.         i 0
  10.          lst  (if (/= "" str1)(cons str1 lst) lst)
  11.       )
  12.     )
  13.   )(reverse lst )
  14. )


下面1.1秒

  1. (defun strtok(str del / a new r)
  2. (setq str(vl-string->list str))
  3. (while str
  4.      (setq a(car str)str(cdr str))
  5.      (if(wcmatch(chr a)del)(setq a nil)(setq new(cons a new)))
  6.      (if(and(or(not str)(not a))new)(setq r(cons new r)new nil))
  7. )
  8. (mapcar ' vl-list->string(mapcar ' reverse (reverse r)))
  9. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 18:54 , Processed in 0.284258 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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