caoyin 发表于 2012-7-4 17:25:41

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

QQ群讨论题目
练习:提取字符串"BM.H0.2W12TT.4KSE15.Y3E-3PD"中的数字
要求返回
(0.2 12 0.4 15.0 0.003)


http://bbs.mjtd.com/xwb/images/bgimg/icon_logo.png 该贴已经同步到 caoyin的微博

阿霸jun 发表于 2012-7-4 17:34:30

safa

阿霸jun 发表于 2012-7-4 18:12:34

(取值 "\\d*[.]?(E-)?\\d+[.]?" "BM.H0.2W12TT.4KSE15.Y3E-3PD") (0.2 12.0 0.4
15.0 0.003)

langjs 发表于 2012-7-4 20:41:15

以前编过一个类似的,不过照版主要求还差点
(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)
)

qjchen 发表于 2012-7-4 21:24:17

:) 参与学习一下,不过这个正则表达式写的比较烂,等下再来看看能否改进
(defun c:test (/ s regex lst)
(setq s "BM.H0.2W12TT.4KSE15.Y3E-3PD" regex (vlax-create-object "VBScript.RegExp"))
(vlax-put-property regex 'globalactrue)
(vlax-put-property regex 'pattern "(\\d+)E[+-](\\d+)|(\\d+)\\.(\\d+)|(\\d+)|\\.(\\d+)")
(vlax-for x (vlax-invoke regex 'execute s)
    (setq lst (cons (atof (vlax-get x 'value)) lst))
)
(vlax-release-object regex)
(reverse lst)
)

qjchen 发表于 2012-7-4 22:39:25

本帖最后由 qjchen 于 2012-7-4 23:08 编辑

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


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



wh89103 发表于 2012-7-5 09:15:01

都是高手,顶贴

Gu_xl 发表于 2012-7-5 10:15:07

本帖最后由 Gu_xl 于 2012-7-5 14:27 编辑


;;参考Lee Mac 的代码修改而来,原帖地址:
http://lee-mac.com/parsenumbers.html

(defun gxl-strparseNumbers(s / dot)
(
   (lambda (l )
   (read
       (strcat "("
      (vl-list->string
   (apply
       'append
   (mapcar
       (function
         (lambda (a b c d)
    (if
      (or
      (< 47 b 58)
      (and (= 43 b) (< 47 c 58) )
      (and (= 45 b) (< 47 c 58) )
      (and (= 46 b)(< 47 a 58) (< 47 c 58))
      (and (= 46 b)(not (< 47 a 58)) (< 47 c 58))
      (and (= 46 b)(< 47 a 58) (not (< 47 c 58)))
      (and (or (= 69 b)(= 101 b)) (< 47 a 58) (or (< 47 c 58) (and (or (= 43 c) (= 45 c)) (< 47 d 58))))
      )
       (if (and (= 46 b)(not (< 47 a 58)) (< 47 c 58))
         (if (not dot)
    (progn (setq dot t) (list48 b))
    (list48 b)
    )
         
         (if (and (= 46 b)(< 47 a 58) (not (< 47 c 58)))
    (if (not dot)
    (listb 48 32)
   (progn (setq dot nil)(list 32 ))
      )
    (if (and (< 47 b 58) (= 45 c))
      (progn (setq dot nil) (list b 32))
      (if (and (= 46 b)(< 47 a 58) (< 47 c 58))
      (if (not dot)
      (progn (setq dot t) (list b))
          (progn (setq dot t) (list 32 48 b))
          )
      (if (and (or (= 69 b)(= 101 b)) (< 47 a 58) (or (< 47 c 58) (and (or (= 43 c) (= 45 c)) (< 47 d 58))))
          (progn (setq dot t) (list b))
      (list b)
          )
      )
      )
    )
         )
       (progn (setq dot nil) '(32))
       )
    )
         )
       (cons nil l)
       l
       (append (cdr l) (list nil))
       (append (cddr l) (list nil nil))
       )
   )
   )
      ")"
      )
       )
   )
    (vl-string->list s)
    )
)
;;测试:
(GXL-STRPARSENUMBERS "BM.H0.2W12TT.4KSE15.Y3E-3PD")
;;返回
(0.2 12 0.4 15.0 0.003)



198526 发表于 2012-7-5 12:08:53

我也尝试着做了一个,请各位老师指点
(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")

198526 发表于 2012-7-5 12:21:50

刚程序没加返回值

(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")
页: [1] 2
查看完整版本: 练习:提取字符串"BM.H0.2W12TT.4KSE15.Y3E-3PD"中的数字