h806600727 发表于 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

tryhi 发表于 2024-6-19 10:14:56

本帖最后由 tryhi 于 2024-6-19 17:38 编辑

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

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

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

(strfg "dhf的得[]分能8897力5零551零[]@K力564DJFK5分能88975零556力11DJ" "" "得")
;;返回("dhf的")
这个函数应该怎么命名比较好?


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


h806600727 发表于 2024-6-19 10:28:50

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

好的,我学习一下正则表达式。:handshake

fangmin723 发表于 2024-6-19 11:39:53

正则表达式多香啊,可以去学学啊

vitalgg 发表于 2024-6-19 12:01:43

本帖最后由 vitalgg 于 2024-6-19 12:10 编辑

;;;; "dhf的得[]分能8897力5零551零[]@K564DJFK5611DJ",提取"能"和"力"中间的8897,或者是"@"后面的字符串K564DJFK5611DJ 。"得"前面的字符串dhf的。只截取有用的部分!
(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))))

(setq str "dhf的得[]分能8897力5零551零[]@K564DJFK5611DJ@dhf的得[]分能8899力5零551零[]@K564DJFK5611DJ")
;;; 两字之间,提取"能"和"力"中间的8897
;; 先用前面的 “能”拆分,再用后面的“力”拆分,结果为列表。
(setq res (cdr (string:to-list str "能")))
(setq res1
      (vl-remove nil
               (mapcar '(lambda(x / sub)
                           (setq sub (string:to-list x "力"))
                           (if (cdr sub)
                               (car sub)))
                         res)))
(princ res1)
;;; "得"前面的字符串,结果为第一个得前面
(setq res (string:to-list str "得"))
(setq res2(if (cdr res)(car res)))
(princ res2)
;;; "@"后面的字符串列表,如果有多个@,返回以@拆分的列表
(setq res (string:to-list str "@"))
(setq res3(if (cdr res) (cdr res)))
(print res3)
(princ)




h806600727 发表于 2024-6-19 19:38:17

tryhi 发表于 2024-6-19 10:14
可惜lsp不支持正则的零宽断言,只能自己切割




好的我试试,谢谢大佬分享

技术工作室 发表于 2024-6-20 07:36:18

谢谢分享!!!!!!!!!!!!!!
页: [1]
查看完整版本: 有那种函数可以提取不等长字符串的指定字符?