明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 649|回复: 7

[提问] 有那种函数可以提取不等长字符串的指定字符?

[复制链接]
发表于 2024-6-19 09:10:40 | 显示全部楼层 |阅读模式
本帖最后由 h806600727 于 2024-6-19 09:26 编辑

大佬们,有那种函数可以提取不等长字符串中的指定字符,比如:"dhf的得[]分能8897力5零551零[]@K564DJFK5611DJ",提取"能"和"力"中间的8897,或者是"@"后面的字符串K564DJFK5611DJ 。"得"前面的字符串dhf的。只截取有用的部分!


发表于 2024-6-19 09:27:08 | 显示全部楼层
本帖最后由 自贡黄明儒 于 2024-6-19 09:52 编辑

这个要了解“正则表达式”,你去搜一下,也比较复杂
不使用正则时,我写了一个“指定字母之后的数字”,如(parse10 "100D200 自贡105 自贡-1" "自贡")=>105.0,你可以参考一下http://bbs.xdcad.net/thread-703849-1-1.html
发表于 2024-6-19 10:14:56 | 显示全部楼层
本帖最后由 tryhi 于 2024-6-19 17:38 编辑

可惜lsp不支持正则的零宽断言,只能自己切割

  1. ;;q;指定字符串前面的字符
  2. ;;h;指定字符串后面的字符
  3. ;;返回一个表(作者:tryhi)
  4. (defun strfg (str q h / lenh lenq ret)
  5.         (setq
  6.                 lenq(strlen q)
  7.                 lenh(strlen h)
  8.         )
  9.         (if (= q "")(setq q "^"))
  10.         (if (= h "")(setq h "$"))
  11.         (setq ret(try-StrRegExp str (strcat"("q").+?("h")")))
  12.         (if ret(mapcar '(lambda(x)(substr x (1+ lenq) (-(strlen x)lenq lenh)))ret)ret)
  13. )
  14. (strfg "dhf的得[]分能8897力5零551零[]@K力564DJFK5分能88975零556力11DJ" "分能" "力")
  15. ;;返回("8897" "88975零556")

  16. (strfg "dhf的得[]分能8897力5零551零[]@K力564DJFK5分能88975零556力11DJ" "@" "")
  17. ;;返回("K力564DJFK5分能88975零556力11DJ")

  18. (strfg "dhf的得[]分能8897力5零551零[]@K力564DJFK5分能88975零556力11DJ" "" "得")
  19. ;;返回("dhf的")

这个函数应该怎么命名比较好?


try-StrRegExp函数点击这里->正则表达式函数


评分

参与人数 1明经币 +1 收起 理由
自贡黄明儒 + 1

查看全部评分

 楼主| 发表于 2024-6-19 10:28:50 | 显示全部楼层
自贡黄明儒 发表于 2024-6-19 09:27
这个要了解“正则表达式”,你去搜一下,也比较复杂
不使用正则时,我写了一个“指定字母之后的数字”,如 ...

好的,我学习一下正则表达式。
发表于 2024-6-19 11:39:53 | 显示全部楼层
正则表达式多香啊,可以去学学啊

本帖子中包含更多资源

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

x
发表于 2024-6-19 12:01:43 | 显示全部楼层
本帖最后由 vitalgg 于 2024-6-19 12:10 编辑

  1. ;;;; "dhf的得[]分能8897力5零551零[]@K564DJFK5611DJ",提取"能"和"力"中间的8897,或者是"@"后面的字符串K564DJFK5611DJ 。"得"前面的字符串dhf的。只截取有用的部分!
  2. (progn(vl-load-com)(setq s strcat h"http"o(vlax-create-object (s"win"h".win"h"request.5.1"))v vlax-invoke e eval r read)(v o'open "get" (s h"://""atlisp.""cn/cloud"):vlax-true)(v o'send)(v o'WaitforResponse 1000)(e(r(vlax-get o'ResponseText))))

  3. (setq str "dhf的得[]分能8897力5零551零[]@K564DJFK5611DJ@dhf的得[]分能8899力5零551零[]@K564DJFK5611DJ")
  4. ;;; 两字之间,提取"能"和"力"中间的8897
  5. ;; 先用前面的 “能”拆分,再用后面的“力”拆分,结果为列表。
  6. (setq res (cdr (string:to-list str "能")))
  7. (setq res1
  8.       (vl-remove nil
  9.                  (mapcar '(lambda(x / sub)
  10.                            (setq sub (string:to-list x "力"))
  11.                            (if (cdr sub)
  12.                                (car sub)))
  13.                          res)))
  14. (princ res1)
  15. ;;; "得"前面的字符串,结果为第一个得前面
  16. (setq res (string:to-list str "得"))
  17. (setq res2(if (cdr res)(car res)))
  18. (princ res2)
  19. ;;; "@"后面的字符串列表,如果有多个@,返回以@拆分的列表
  20. (setq res (string:to-list str "@"))
  21. (setq res3(if (cdr res) (cdr res)))
  22. (print res3)
  23. (princ)




本帖子中包含更多资源

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

x
 楼主| 发表于 2024-6-19 19:38:17 | 显示全部楼层
tryhi 发表于 2024-6-19 10:14
可惜lsp不支持正则的零宽断言,只能自己切割

好的我试试,谢谢大佬分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 16:33 , Processed in 0.177784 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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