明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4744|回复: 16

[已解答] LISP中在字符串中提取数字

[复制链接]
发表于 2015-10-31 23:32 | 显示全部楼层 |阅读模式
要想把一些不规则含数字的字符串中的数字分别提取处理要怎么办啊?

例如:

情况一:"12.21ABC73.9·20A"字符串得到分开的三个数字 "12.21" "73.9" "20"
情况二:"1200ABAC30·10BA"字符串得到分开的三个数字 "1200" "30" "10"


谢谢啊!

该贴已经同步到 取个长点勒名字的微博
发表于 2020-7-29 11:18 | 显示全部楼层
llsheng_73 发表于 2015-11-1 00:21
这个用正则好象最好搞,只是我不会正则

拿走 学习一下
发表于 2020-8-22 11:21 | 显示全部楼层
  多谢大神分享,学习一下!
发表于 2015-11-1 00:21 | 显示全部楼层
本帖最后由 llsheng_73 于 2015-12-11 11:45 编辑

这个用正则好象最好搞,只是我不会正则
  1. (defun tt(a / b c d e)
  2.   (setq b(vl-string->list a))
  3.   (while b
  4.     (setq a(car b)b(cdr b)c(car b)d(if(or(= a 46)(< 47 a 58))(list a)))
  5.     (while(or(and(< -1 a 46)(< -1 c 46))
  6.       (or(= a 46)(= c 46))
  7.       (and(< 47 a 58)(< 47 c 58))
  8.       (and(> a 57)(> c 57))
  9.              (and(> a 128)(> c 128))
  10.              (and(> a 128)(< c 129)(/=(length d)(*(/(length d)2)2))))
  11.       (setq a(car b)b(cdr b)c(car b)
  12.      d(if(or(< 47 a 58)(and(= a 46)(not(member 46 d))))(cons a d)d)))
  13.     (setq e(if d(cons(reverse d)e)e)))
  14.   (mapcar'VL-LIST->STRING(reverse e))
  15.   )


_$ (tt"12.21ABC73.9·2.....0A")
("12.21" "73.9" "2.0")
_$ (tt"12.21ABC73.9·20A")
("12.21" "73.9" "20")
 楼主| 发表于 2015-11-1 02:18 | 显示全部楼层
llsheng_73 发表于 2015-11-1 00:21
这个用正则好象最好搞,只是我不会正则

厉害啊!要是 7888和5555能分开成独立的字符串就更厉害了
发表于 2015-11-1 09:57 | 显示全部楼层
取个长点勒名字 发表于 2015-11-1 02:18
厉害啊!要是 7888和5555能分开成独立的字符串就更厉害了


已更正,还是用正则最方便,可惜我不会用那个
 楼主| 发表于 2015-11-1 11:41 来自手机 | 显示全部楼层
llsheng_73 发表于 2015-11-1 09:57
已更正,还是用正则最方便,可惜我不会用那个

谢谢啊。看起来有点复杂,得慢慢理解~
发表于 2015-11-1 22:04 来自手机 | 显示全部楼层
取个长点勒名字 发表于 2015-11-1 11:41
谢谢啊。看起来有点复杂,得慢慢理解~

这个正需要呢
发表于 2015-11-2 08:16 | 显示全部楼层
_$ (RegExpS "[0-9]+[.0-9]+|[0-9]+" "13212.00adfsa1321" "i")
("13212.00" "1321")
发表于 2015-11-2 09:02 | 显示全部楼层

  1. ;;--------------------------------------------主函数----------------------------------------------------;;
  2. (defun xxexp (pat str key / end)
  3.   (princ "\n ★"一刀屠文"(xxexp)(xxexpr) = 对字符串进行正则表达式测试及替换-by 梁雄啸.2007.7")
  4.   (vl-load-com)
  5.   (if (not *xxvbsexp)
  6.     (setq *xxvbsexp (vlax-get-or-create-object "VBScript.RegExp"))
  7.   )
  8.   (vlax-put *xxvbsexp 'Pattern pat)
  9.   (if (not key)(setq key ""))  
  10.   (setq key (strcase key))
  11.   (setq keys '(("I"  "IgnoreCase")("G"  "Global")("M"  "Multiline")))
  12.   (mapcar '(lambda(x)
  13.        (if (wcmatch key (strcat "*" (car x) "*"))
  14.          (vlax-put *xxvbsexp (read(cadr x)) 0)
  15.          (vlax-put *xxvbsexp (read(cadr x)) -1)
  16.          ))
  17.     keys)
  18.   (setq matches (vlax-invoke *xxvbsexp 'Execute str))
  19.   (vlax-for x matches (setq end (cons (vla-get-value x) end)))
  20.   (reverse end)
  21. )
  22. ;;--------------------------------------------end----------------------------------------------------;;
  23. (setq str "a-.3A0.0+9.5d-1.3 1.2e-58d4d-15.1d5.6asf-1.2"
  24.       pat "[+|-]?\\d*\\.?\\d+(e[+|-]*\\d+)*")
  25. (xxexp  pat str "")
发表于 2015-11-2 15:12 | 显示全部楼层
llsheng_73 发表于 2015-11-1 00:21
这个用正则好象最好搞,只是我不会正则

去学习一下啊,等你载誉归来

正则表达式30分钟入门-2013(转)
http://bbs.mjtd.com/forum.php?mo ... &fromuid=399892
发表于 2015-11-2 16:11 | 显示全部楼层
菜卷鱼 发表于 2015-11-2 15:12
去学习一下啊,等你载誉归来

正则表达式30分钟入门-2013(转)


那个都不知道看了好多个30分钟了,大概能理解,但不知道怎么在lisp里边写
当然,哪次都没能看够30分钟
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-4 16:58 , Processed in 0.374256 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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