明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2654|回复: 12

请问如何提取字符串中的数值?

[复制链接]
发表于 2011-6-21 10:48:49 | 显示全部楼层 |阅读模式
(setq string "X-12.0314 Y26.9145 I48.7961 J-14.9177")
请问如何提出string中的x,y,I,J值??各数值的位数是不定的,即是可变的。例如x=12.03,y=26,I=148,J=14
发表于 2018-8-21 00:31:04 | 显示全部楼层
(read (strcat "(" (vl-string-translate "XYIJ" "    " String) ")"))
回复 支持 1 反对 0

使用道具 举报

发表于 2024-6-24 16:31:50 | 显示全部楼层
这个适用性强点(defun extract-numeric-from-text (text)
  (setq str-list (vl-string->list text)) ; 将字符串转换为字符列表
  (setq num-list nil) ; 用于存储数字字符
  (foreach char str-list
    (if (and (>= char 48) (<= char 57)) ; 48 到 57 是数字 0 到 9 的 ASCII 码值
        (setq num-list (append num-list (list char)))
        (setq num-list (append num-list (list 32)))
    )
  )
  (setq num-str (vl-list->string num-list)) ; 将数字字符列表转换回字符串
)
发表于 2011-6-21 11:20:35 | 显示全部楼层
(setq string "X-12.0314 Y26.9145 I48.7961 J-14.9177")
(setq n1 (vl-string-position (ascii "X") string))
(setq n2 (vl-string-position (ascii "Y") string))
(setq n3 (vl-string-position (ascii "I") string))
(setq n4 (vl-string-position (ascii "J") string))
(setq X (substr string (+ n1 2) (- n2 n1 2)))
(setq Y (substr string (+ n2 2) (- n3 n2 2)))
(setq I (substr string (+ n3 2) (- n4 n3 2)))
(setq J (substr string (+ n4 2)))
发表于 2011-6-21 16:52:56 | 显示全部楼层
本帖最后由 zhynt 于 2011-6-21 16:53 编辑

  1. ;;将由相同分隔字符分隔的字符串组成表(忽略“空”字串)
  2. (defun zhy_string_tok (sstring sstr / n1 n2 m2 str_1 string_list)
  3.   (setq string_list '())
  4.   (setq n1 (strlen sstring))
  5.   (setq n2 (strlen sstr))
  6.   (while (setq m2 (zhy_string_find sstring sstr))
  7.     (setq str_1 (substr sstring 1 (- m2 1)))
  8.     (setq sstring (substr sstring (+ m2 n2)))
  9.     (if        (/= str_1 "")
  10.       (setq string_list (cons str_1 string_list))
  11.     )
  12.   )
  13.   (if (/= sstring "")
  14.     (setq string_list (cons sstring string_list))
  15.   )
  16.   (reverse string_list)
  17. )
  18. ;;======================================================
  19. (defun str (str)
  20.   (setq str_lst (zhy_string_tok str " "))
  21.   (setq n (length str_lst))
  22.   (setq        st1 '()
  23.         st2 '()
  24.         m 0
  25.   )  
  26.   (while (/= n m)
  27.     (setq st1 (cons (substr (nth  m str_lst) 1 1) st1)
  28.           st2 (cons (substr (nth  m str_lst) 2) st2)
  29.           m   (1+ m)
  30.     )
  31.   )
  32.   (setq        st1 (reverse st1)
  33.         st2 (reverse st2)
  34.   )
  35. )

(setq string "X-12.0314 Y26.9145 I48.7961 J-14.9177")
(str string)
st1==>
("X" "Y" "I" "J")
st2==>
("-12.0314" "26.9145" "48.7961" "-14.9177")
发表于 2011-6-21 17:22:06 | 显示全部楼层
zhy_string_find 没有? 没有办法用了
发表于 2011-6-21 19:38:34 | 显示全部楼层

  1. ;;;在字符串中搜索指定的字符串,返回发现的第一个字符串出现的位置(第一位为1)
  2. ;;;
  3. (defun zhy_string_find (string str / n m na str_1 string str)
  4.   (setq n (strlen string))
  5.   (setq na (strlen str))
  6.   (setq m 0)
  7.   (while (/= m n)
  8.     (setq m (1+ m))
  9.     (setq str_1 (substr string m na))
  10.     (if        (= str_1 str)
  11.       (setq n m)
  12.     )
  13.   )
  14. )
 楼主| 发表于 2011-6-22 08:55:09 | 显示全部楼层
谢谢大家!
发表于 2011-6-22 11:14:33 | 显示全部楼层
好像很复杂呢~
发表于 2011-6-25 14:28:35 | 显示全部楼层
kyo90 发表于 2011-6-22 11:14
好像很复杂呢~

;;这个可能简单些
;;(setq str "aa 10.2 b10x20.2")
;;(getNumberS str)返回("10.2" "10" "20.2")
;;======================================================
(defun getNumberS (str / ASC N STR1 STRN)
  ;;先将非数字用空格代替
  (setq n 1)
  (setq str1 "")
  (repeat (strlen str)
    (setq strn (substr str n 1))
    (setq Asc (ascii strn))
    (if (or (and (> Asc 47) (< Asc 58)) (= Asc 46))
      (setq str1 (strcat str1 strn))
      (setq str1 (strcat str1 " "))
    )
    (setq n (1+ n))
  )
  (strinSplitS str1)
)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2011-6-25 14:29:58 | 显示全部楼层
;;这个可能简单些
;;提取字符串中数字
;;(setq str "aa 10.2 b10x20.2")
;;(getNumberA str)返回(10.2 10 20.2)
;;======================================================
(defun getNumberA (str / N STR1 STRN)
  ;;先将非数字用空格代替
  (setq n 1)
  (setq str1 "")
  (repeat (strlen str)
    (setq strn (substr str n 1))
    (if (wcmatch strn "#,.")
      (setq str1 (strcat str1 strn))
      (setq str1 (strcat str1 " "))
    )
    (setq n (1+ n))
  )
  (strinSplitA str1)
)
;;;

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

点评

只能更换非汉字的,有汉字的就不能提取了  发表于 2024-6-24 14:21
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 13:36 , Processed in 0.196608 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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