取个长点勒名字 发表于 2015-10-31 23:32:04

LISP中在字符串中提取数字

要想把一些不规则含数字的字符串中的数字分别提取处理要怎么办啊?

例如:

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


谢谢啊!

http://bbs.mjtd.com/xwb/images/bgimg/icon_logo.png 该贴已经同步到 取个长点勒名字的微博

Qwer1243 发表于 2020-7-29 11:18:18

llsheng_73 发表于 2015-11-1 00:21
这个用正则好象最好搞,只是我不会正则




拿走 学习一下

电赛加油 发表于 2020-8-22 11:21:17

多谢大神分享,学习一下!

llsheng_73 发表于 2015-11-1 00:21:55

本帖最后由 llsheng_73 于 2015-12-11 11:45 编辑

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

_$ (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:03

llsheng_73 发表于 2015-11-1 00:21 static/image/common/back.gif
这个用正则好象最好搞,只是我不会正则

厉害啊!要是 7888和5555能分开成独立的字符串就更厉害了

llsheng_73 发表于 2015-11-1 09:57:52

取个长点勒名字 发表于 2015-11-1 02:18 http://bbs.mjtd.com/static/image/common/back.gif
厉害啊!要是 7888和5555能分开成独立的字符串就更厉害了

已更正,还是用正则最方便,可惜我不会用那个

取个长点勒名字 发表于 2015-11-1 11:41:55

llsheng_73 发表于 2015-11-1 09:57
已更正,还是用正则最方便,可惜我不会用那个

谢谢啊。看起来有点复杂,得慢慢理解~

winerfjy 发表于 2015-11-1 22:04:41

取个长点勒名字 发表于 2015-11-1 11:41
谢谢啊。看起来有点复杂,得慢慢理解~

这个正需要呢

ivde 发表于 2015-11-2 08:16:16

_$ (RegExpS "+[.0-9]+|+" "13212.00adfsa1321" "i")
("13212.00" "1321")

springwillow 发表于 2015-11-2 09:02:31


;;--------------------------------------------主函数----------------------------------------------------;;
(defun xxexp (pat str key / end)
(princ "\n ★\"一刀屠文\"(xxexp)(xxexpr) = 对字符串进行正则表达式测试及替换-by 梁雄啸.2007.7")
(vl-load-com)
(if (not *xxvbsexp)
    (setq *xxvbsexp (vlax-get-or-create-object "VBScript.RegExp"))
)
(vlax-put *xxvbsexp 'Pattern pat)
(if (not key)(setq key ""))
(setq key (strcase key))
(setq keys '(("I""IgnoreCase")("G""Global")("M""Multiline")))
(mapcar '(lambda(x)
       (if (wcmatch key (strcat "*" (car x) "*"))
         (vlax-put *xxvbsexp (read(cadr x)) 0)
         (vlax-put *xxvbsexp (read(cadr x)) -1)
         ))
    keys)
(setq matches (vlax-invoke *xxvbsexp 'Execute str))
(vlax-for x matches (setq end (cons (vla-get-value x) end)))
(reverse end)
)
;;--------------------------------------------end----------------------------------------------------;;
(setq str "a-.3A0.0+9.5d-1.3 1.2e-58d4d-15.1d5.6asf-1.2"
      pat "[+|-]?\\d*\\.?\\d+(e[+|-]*\\d+)*")
(xxexppat str "")

菜卷鱼 发表于 2015-11-2 15:12:32

llsheng_73 发表于 2015-11-1 00:21 static/image/common/back.gif
这个用正则好象最好搞,只是我不会正则




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

正则表达式30分钟入门-2013(转)
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=110663&fromuid=399892

llsheng_73 发表于 2015-11-2 16:11:24

菜卷鱼 发表于 2015-11-2 15:12 http://bbs.mjtd.com/static/image/common/back.gif
去学习一下啊,等你载誉归来

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


那个都不知道看了好多个30分钟了,大概能理解,但不知道怎么在lisp里边写
当然,哪次都没能看够30分钟
页: [1] 2
查看完整版本: LISP中在字符串中提取数字