找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3333|回复: 16

[LISP程序]:字符串数字提取超级缩水篇

[复制链接]
发表于 2002-10-16 03:08:44 | 显示全部楼层 |阅读模式

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

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

×
相关链接: http://www.xdcad.net/forum/showt ... y=&pagenumber=1

   说是缩水,可是功能一点都没有缩水哦 :)---欢迎切磋

  看了qlin 朋友写的程序,总觉得可以写得简短些。我是个懒人,所以程序也喜欢写短一点的:)但是这几天忙,晚上都要加班到11:30~12点 :(,程序写了3次,因为写了一半,我又有了别的主意:$,所以断断续续的到今天才算大功告成。当然程序的长度也由40多行变30多行变到现在的20多,可以说是真正的缩水了。
  原本想用 atof 避开e+,e-的检查,但是后来发现,用了atof,需要再用rtos转回来的时候,会丢失数据精度。:×后来在wcmatch上下功夫,过虑功能很好:)豁然开朗

我自己测试了一个 “中文2.35e+35测试-.035list2E3just a test89.0end”
返回("中文" "2.35e+35" "测试" "-.035" "list" "2E3" "just a test" "89.0" "end")

好了,大家看看我的程序吧。请测试一下。

  1. [FONT=courier new]
  2. ;
  3. (defun c:strdiv ( / st stl lst i ii key)
  4.   (princ "\n strdiv---v1.0---字符串分列表--------dreamsky-xdcad.com----2002.10")
  5.   (setq st (getstring "\n输入字符串:")
  6.         stl (strlen st)
  7.         lst '()
  8.         i 1
  9.         ii 1)
  10.   (repeat stl               
  11.     (if (or (wcmatch (substr st i 1) "#" )
  12.             (wcmatch (substr st i 2) "[+-.e]#,e[+-],[+-].")  ;;*****
  13.          )
  14.         (setq key "nom")
  15.         (setq key "str")
  16.      );end if
  17.     (if (= 1 i)(setq key2 key))
  18.     (cond
  19.        ((= stl i)(setq lst (cons (substr st ii (- (1+ i) ii)) lst)) )
  20.        ((/= key2 key)
  21.         (setq lst (cons (substr st ii (- i ii)) lst)
  22.               ii i
  23.               key2 key
  24.         ))
  25.      )
  26.     (setq i (1+ i))   
  27.   )
  28. (setq lst (reverse lst))
  29. )
  30.   [/FONT]


下载:
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
 楼主| 发表于 2002-10-16 03:29:12 | 显示全部楼层
不得不说的问题:
有朋友提出 不用过虑e的问题,只要把上面 ;;*****一行改为
(wcmatch (substr st i 2) "[+-.]#,[+-].")
另外你也可以根据自己需要调整 过虑 条件
如要过虑 %%c,%%d,%%p  ,加入 “%%[cdp]”

(wcmatch (substr st i 3) "%%[cdp]")

如要过虑 “ ”(空格)“,” “;” : (wcmatch (substr st i 1) " ,',,;" )
注意 ,前加’转义字符。
【引】在 wcmatch 中使用转义字符

要测试一个字符串中的通配符,可以使用单个单引号 (`) 来转义字符。转义是指跟在单个单引号后面的字符不当作通配符读取,而是按其表面值进行比较。例如,为了测试在字符串 Name 中是否包含逗号,可以使用如下表达式:

命令:(wcmatch "Name" "*`,*")

#  (磅值符号)        匹配任意单个数值字符
【/引】
(wcmatch (substr st i 3) "[+-].#")    ;;;大家看看:)这样是否准确些?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-10-16 03:44:26 | 显示全部楼层
思路分析2
在repeat过程中,程序用了一个 key 对不同性质的数据进行判断,当key 改变,将从“ii”到“i”记录的字符写入表 lst中。并且把key值存为key2,以便将来key改变时作为对比条件。同时,记录改变时候的 i 值为 ii.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-10-16 04:11:32 | 显示全部楼层
之所以要 (wcmatch (substr st i 2) "[+-.e]#,e[+-],[+-].")  
是考虑到以下特殊情况:   +3, .5 ,  e25, e+45, +.134.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2002-10-16 14:30:58 | 显示全部楼层
欢迎切磋,把xd论坛的学术氛围搞火。 :)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-10-16 15:05:05 | 显示全部楼层
其实大家改一下上面的 (if (wcmatch....)...) 相关项,就可以自己diy 了。
举例:
1。"ab1cd2e3d4",只想取1.2.3.4
     (if (wcmatch (substr st i 1) "#" )...)
2.分区轴号 AB-1 AB-2 AB-3........ ED-24...
   (if (wcmatch (substr st i 1) " " )...)
   ....
  (setq lst (...) key2 key ii (1+ i))   ;;;改了ii 的赋值 跳过“ ”  
3.分区轴号 AB-1AB-2AB-3........ ED-24...(没有空格相隔开!)
  (if (wcmatch (substr st i 4) "@@-#" )...)
4.分区轴号A-1A-2B-4...
(if (wcmatch (substr st i 3) "@-#" )...)
对3,4项目可以用(or(wcmatch..)())合并考虑,如果当中夹有其它字符,如
A-1A-2AB-4@ A-3D^8AB-4... 中的"@ " "D^8"为多余字符
可以在 检测到符合3,4项条件时,(setq  ii i i (+ i 3)) , 并当
(if (wcmatch (substr st i 1) "#" ) (setq key "nom")(setq key "str"))
  key等于"str"时,马上将ii 到 i 的字符 传入 lst

5.至于区分1-2 3-12 ... 的只能在生成数据的时候加个" "或者; ,分隔了。
要不 1-234-56-2   究竟是 1-2,34-5,6-2 还是 1-23,4-5,6-2,连人都分不清了,何况程序!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-10-16 17:30:51 | 显示全部楼层

Re: [LISP程序]:字符串数字提取超级缩水篇

最初由 无痕 发布
[B]相关链接: http://www.xdcad.net/forum/showt ... y=&pagenumber=1

   说是缩水,可是功能一点都没有缩水哦 :)---欢迎切磋

  看了qlin 朋友写的程?.. [/B]


谢谢,加爱心币20,鼓励。

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2002-10-16 23:18:39 | 显示全部楼层
别急!还不对.
(de3e4ff)---------->("d""e3e4""ff")
我想是应该判断e 前是不是数字或点吧,不光是后面.
e3e4不是数字吧,不要我搞错了.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-10-31 19:40:27 | 显示全部楼层
"str--2----str--e-2-2.2.2.2str.2stre.2str--2e.2str-2e0.3--str-2e-3.str-.2e-5.5.6str6+5-8.6"
=>("str" "--2---" "-str" "-" "-" "e-2-2.2.2.2" "str" ".2" "stre" ".2" "str" "--2" "e" ".2" "st r" "-2e0.3-" "-str" "-2e-3" ".str" "-.2e-5.5.6" "str" "6+5-8.6")
  我想还要对数据进行后处理
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-3-14 15:58:30 | 显示全部楼层
我觉得这是格式上的自虐。:)

就是为什要用
“中文2.35e+35测试-.035list2E3just a test89.0end”这样的格式。
给个理由先。lisp牛的应该是表。
当然作为学术探讨怎么做都无可厚非。呵呵。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-3-14 16:31:38 | 显示全部楼层
好奇--这有什么用啊?
如果是用在将字串的尾巴进行修改或头部数字进行变动,也用不了如此复杂啊。
就算是修改钢筋的话,如“2圆20+3圆18”,象上面这样提取也太……了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2008-9-18 20:20:47 | 显示全部楼层
还是有点问题 如末尾再加一个数字
如“中文2.35e+35测试-.035list2E3just a test89.0end6”
提取出来的结果是
("中文" "2.35e+35" "测试" "-.035" "list" "2" "E" "3" "just a test" "89.0" "end6")
像一些简单的如 14x7
出来结果是  ("14" "x7")
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-9-22 00:56:16 | 显示全部楼层
请搜索 “正则表达式”。后来用正则表达式写的提取数字,比较完善了。用wcmatch处理汉字还是有点力不从心。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-16 14:36 , Processed in 0.485269 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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