练习:提取字符串"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的微博 safa (取值 "\\d*[.]?(E-)?\\d+[.]?" "BM.H0.2W12TT.4KSE15.Y3E-3PD") (0.2 12.0 0.4
15.0 0.003) 以前编过一个类似的,不过照版主要求还差点
(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)
) :) 参与学习一下,不过这个正则表达式写的比较烂,等下再来看看能否改进
(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 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)
)
都是高手,顶贴 本帖最后由 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)
我也尝试着做了一个,请各位老师指点
(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") 刚程序没加返回值
(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