明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3826|回复: 14

练习:提取字符串"BM.H0.2W12TT.4KSE15.Y3E-3PD"中的数字

  [复制链接]
发表于 2012-7-4 17:25 | 显示全部楼层 |阅读模式
QQ群讨论题目
练习:提取字符串"BM.H0.2W12TT.4KSE15.Y3E-3PD"中的数字
要求返回
(0.2 12 0.4 15.0 0.003)


该贴已经同步到 caoyin的微博
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2012-7-4 17:34 | 显示全部楼层
safa
发表于 2012-7-4 18:12 | 显示全部楼层
(取值 "\\d*[.]?(E-)?\\d+[.]?" "BM.H0.2W12TT.4KSE15.Y3E-3PD") (0.2 12.0 0.4
15.0 0.003)
发表于 2012-7-4 20:41 | 显示全部楼层
以前编过一个类似的,不过照版主要求还差点
(defun strtolst (str / i ls lst st str1) ; 提取字符串中的数字转化为实数表
  (setq ls '("0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "."))
  (setq i 1 str1 "" lst '())
  (repeat (strlen str)
    (if (member (setq st (substr str i 1)) ls)
      (setq str1 (strcat str1 st))
      (if (/= str1 "")(setq lst (cons (atof str1) lst) str1 ""))
    )
    (setq i (1+ i))
  )
  (if (member st ls)(setq lst (cons (atof str1) lst)))
  (reverse lst)
)
发表于 2012-7-4 21:24 | 显示全部楼层
:) 参与学习一下,不过这个正则表达式写的比较烂,等下再来看看能否改进

  1. (defun c:test (/ s regex lst)
  2.   (setq s "BM.H0.2W12TT.4KSE15.Y3E-3PD" regex (vlax-create-object "VBScript.RegExp"))
  3.   (vlax-put-property regex 'global  actrue)
  4.   (vlax-put-property regex 'pattern "(\\d+)E[+-](\\d+)|(\\d+)\\.(\\d+)|(\\d+)|\\.(\\d+)")
  5.   (vlax-for x (vlax-invoke regex 'execute s)
  6.     (setq lst (cons (atof (vlax-get x 'value)) lst))
  7.   )
  8.   (vlax-release-object regex)
  9.   (reverse lst)
  10. )

点评

有一个bug? "1e-1"=>(1.0 1.0)  发表于 2012-7-4 21:44
发表于 2012-7-4 22:39 | 显示全部楼层
本帖最后由 qjchen 于 2012-7-4 23:08 编辑

to xshrimp
稍微改进的版本,可以判别正负数,添加了E和e都可以作为科学记数法但是有点奇怪的是多个负数连续的时候,会出问题,如-0.2-13.0之类的阿霸jun 朋友的写法可能会比我简约,但也可能会有些情况没有考虑到的


  1. (defun c:test1 (/ s regex lst)
  2.   (setq s "BM.H-0.2a-12.3TT-.4KSE15.Y2.3E-1PD" regex (vlax-create-object "VBScript.RegExp"))
  3.   (vlax-put-property regex 'global  actrue)
  4.   (vlax-put-property regex 'pattern "[-+]?(\\d+)?[.]?(\\d+)([Ee][+-](\\d+))?")
  5.   (vlax-for x (vlax-invoke regex 'execute s)
  6.     (setq lst (cons (atof (vlax-get x 'value)) lst))
  7.   )
  8.   (vlax-release-object regex)
  9.   (reverse lst)
  10. )



发表于 2012-7-5 09:15 | 显示全部楼层
都是高手,顶贴
发表于 2012-7-5 10:15 | 显示全部楼层
本帖最后由 Gu_xl 于 2012-7-5 14:27 编辑

游客,本帖隐藏的内容需要发帖数高于 10 才可浏览,你当前发帖数只有 0


点评

还有bug不? (GXL-STRPARSENUMBERS "1.1.1.1")=>(1) (GXL-STRPARSENUMBERS "25e+5")=>(25 5) (GXL-STRPARSENUMBERS "5e-5")=>(5 -5)  发表于 2012-7-5 11:00
发表于 2012-7-5 12:08 | 显示全部楼层
我也尝试着做了一个,请各位老师指点
(defun srtnum-lst (ab )
(defun srtnum ( a / nn num AA)
  (if (/= (SUBSTR A 1 1) ".")
  (if (numberp (READ (SUBSTR A 1 1)))
    (PROGN
      (sETQ NN 0)
      (sETQ NUM (ATOF A))
      (Setq lst (append lst (list num)))
      (WHILE (/= (ATOF (SUBSTR A N (sETQ NN (1+ NN)))) NUM))
      (setq aa (SUBSTR A (1+ Nn)))      
    )
   (Setq aa (SUBSTR A 2 ))
    )
    (if (and (/= (SUBSTR A 2 1) ".")(= (type (read(SUBSTR A 2 1))) 'int))
    (sETQ AA (srtnum (STRCAT "0" a ) ))
      (Setq aa (SUBSTR A 2 ))
      )
    )
  AA
  )
      
(setq lst nil)
(SETQ N 1)
(WHILE (> (STRLEN AB) 0)
  (sETQ AB (srtnum aB ))
  )
)
(srtnum-lst "BM.H0.2W12TT0.4KSE15.Y3E-3PD")
发表于 2012-7-5 12:21 | 显示全部楼层
刚程序没加返回值

(defun srtnum-lst (ab / lst)
(defun srtnum ( a / nn num AA)
  (if (/= (SUBSTR A 1 1) ".")
  (if (numberp (READ (SUBSTR A 1 1)))
    (PROGN
      (sETQ NN 0)
      (sETQ NUM (ATOF A))
      (Setq lst (append lst (list num)))
      (WHILE (/= (ATOF (SUBSTR A N (sETQ NN (1+ NN)))) NUM))
      (setq aa (SUBSTR A (1+ Nn)))      
    )
   (Setq aa (SUBSTR A 2 ))
    )
    (if (and (/= (SUBSTR A 2 1) ".")(= (type (read(SUBSTR A 2 1))) 'int))
    (sETQ AA (srtnum (STRCAT "0" a ) ))
      (Setq aa (SUBSTR A 2 ))
      )
    )
  AA
  )
      
(setq lst nil)
(SETQ N 1)
(WHILE (> (STRLEN AB) 0)
  (sETQ AB (srtnum aB ))
  )
  lst
)
(srtnum-lst "BM.H0.2W12TT0.4KSE15.Y3E-3PD")
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-25 21:38 , Processed in 0.436694 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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