明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: caoyin

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

  [复制链接]
发表于 2012-7-5 13:29:58 | 显示全部楼层
本帖最后由 阿霸jun 于 2012-7-5 13:45 编辑

(defun test(pat str / aa)
  (setq aa (regex pat str ""))
  (setq aa (mapcar '(lambda (x) (atof x)) aa))
)
regex是正则函数,测试:
命令: (test "\\d*[.]?(\\d+E-)?(\\d+E)?\\d+[.]?" "BM.H0.2W12TT.4KSE15.Y3E3PD")
(0.2 12.0 0.4 15.0 3000.0)

命令: (test "\\d*[.]?(\\d+E-)?(\\d+E)?\\d+[.]?" "BM.H0.2W12TT.4KSE15.Y3E-3PD")
(0.2 12.0 0.4 15.0 0.003)
发表于 2012-7-5 14:12:22 | 显示全部楼层
Gu_xl 发表于 2012-7-5 10:15
;;参考Lee Mac 的代码修改而来,原帖地址:
http://lee-mac.com/parsenumbers.html

8楼代码已修正Bug
发表于 2012-7-5 14:22:12 | 显示全部楼层
本帖最后由 xshrimp 于 2012-7-5 14:39 编辑

  1. (defun gxl  (s / dot)
  2.   (
  3.    (lambda (l )
  4.      (read
  5.        (strcat "("
  6.         (vl-list->string
  7.    (apply
  8.        'append
  9.      (mapcar
  10.        (function
  11.          (lambda (a b c d)
  12.     (if
  13.       (or
  14.         (< 47 b 58)
  15.          (and (= 43 b) (< 47 c 58) )
  16.         (and (= 45 b) (< 47 c 58) )
  17.         (and (= 46 b)  (< 47 a 58) (< 47 c 58))
  18.         (and (= 46 b)  (not (< 47 a 58)) (< 47 c 58))
  19.         (and (= 46 b)  (< 47 a 58) (not (< 47 c 58)))
  20.         (and (or (= 69 b)(= 101 b)) (< 47 a 58) (or (< 47 c 58) (and (or (= 43 c) (= 45 c)) (< 47 d 58))))
  21.         )
  22.        (if (and (= 46 b)  (not (< 47 a 58)) (< 47 c 58))
  23.          (if (not dot)
  24.     (progn (setq dot t) (list  48 b))
  25.     (list  48 b)
  26.     )

  27.          (if (and (= 46 b)  (< 47 a 58) (not (< 47 c 58)))
  28.     (if (not dot)
  29.     (list  b 48 32)
  30.      (progn (setq dot nil)  (list 32 ))
  31.       )
  32.     (if (and (< 47 b 58) (= 45 c))
  33.       (progn (setq dot nil) (list b 32))
  34.       (if (and (= 46 b)  (< 47 a 58) (< 47 c 58))
  35.         (if (not dot)
  36.         (progn (setq dot t) (list b))
  37.           (progn (setq dot t) (list 32 48 b))
  38.           )
  39.         (list b)
  40.         )
  41.       )
  42.     )
  43.          )
  44.        (progn (setq dot nil) '(32))
  45.        )
  46.     )
  47.          )
  48.        (cons nil l)
  49.        l
  50.        (append (cdr l) (list nil))
  51.        (append (cddr l) (list nil nil))
  52.        )
  53.      )
  54.    )
  55.         ")"
  56.         )
  57.        )
  58.      )
  59.     (vl-string->list s)
  60.     )
  61.   )


  62. (defun qjchen (s /  lst regex x)
  63.   (setq regex (vlax-create-object "VBScript.RegExp"))
  64.   (vlax-put-property regex 'global  actrue)
  65.   (vlax-put-property regex 'pattern "[-+]?(\\d+)?[.]?(\\d+)([Ee][+-](\\d+))?")
  66.   (vlax-for x (vlax-invoke regex 'execute s)
  67.     (setq lst (cons (atof (vlax-get x 'value)) lst))
  68.   )
  69.   (vlax-release-object regex)
  70.   (reverse lst)
  71. )


(list "1.1.1.1" "5e-0.5A12"  "5e0.5A12" "AB0.125e5C+-.2.2D3")
正确返回值
((1.1 0.1 0.1) (5 -0.5 12) (5 0.5 12) (12500.0  0.2 0.2 3))

(mapcar 'gxl    (list "1.1.1.1" "5e-0.5A12"  "5e0.5A12" "AB0.125e5C+-.2.2D3"))
=>((1.1 0.1 0.1) (5E-0 12) (5E0 12) (12500.0 0.2 0.2 3))


(mapcar 'qjchen (list "1.1.1.1" "5e-0.5A12"  "5e0.5A12" "AB0.125e5C+-.2.2D3"))
=>((1.1 0.1 0.1) (5.0 0.5 12.0) (5.0 0.5 12.0) (0.125 5.0 -0.2 0.2 3.0))

发表于 2014-4-24 22:27:47 | 显示全部楼层
Gu_xl 发表于 2012-7-5 10:15
;;参考Lee Mac 的代码修改而来,原帖地址:
http://lee-mac.com/parsenumbers.html

G版 请问 我要接力怎么接啊 比如你的程序出来的是(0.4 5 6) 我想用读取第一个数  第二个 第三个数 用于后面的计算 怎么写啊?
发表于 2014-8-30 22:08:04 | 显示全部楼层
学习了。谢谢。在用这个!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-28 11:08 , Processed in 0.165715 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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