有那种函数可以提取不等长字符串的指定字符?
本帖最后由 h806600727 于 2024-6-19 09:26 编辑大佬们,有那种函数可以提取不等长字符串中的指定字符,比如:"dhf的得[]分能8897力5零551零[]@K564DJFK5611DJ",提取"能"和"力"中间的8897,或者是"@"后面的字符串K564DJFK5611DJ 。"得"前面的字符串dhf的。只截取有用的部分!
本帖最后由 自贡黄明儒 于 2024-6-19 09:52 编辑
这个要了解“正则表达式”,你去搜一下,也比较复杂
不使用正则时,我写了一个“指定字母之后的数字”,如(parse10 "100D200 自贡105 自贡-1" "自贡")=>105.0,你可以参考一下http://bbs.xdcad.net/thread-703849-1-1.html
本帖最后由 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函数点击这里->正则表达式函数
自贡黄明儒 发表于 2024-6-19 09:27
这个要了解“正则表达式”,你去搜一下,也比较复杂
不使用正则时,我写了一个“指定字母之后的数字”,如 ...
好的,我学习一下正则表达式。:handshake 正则表达式多香啊,可以去学学啊
本帖最后由 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)
tryhi 发表于 2024-6-19 10:14
可惜lsp不支持正则的零宽断言,只能自己切割
好的我试试,谢谢大佬分享 谢谢分享!!!!!!!!!!!!!!
页:
[1]