Lee Mac的分割函数Str2Lst扩展,自产自销
;Str2Lst是Lee Mac的分割函数扩展论坛很多就不列出来了;下面根据Lee Mac的分割函数扩展,支持多个分割字符
;调用(Str2Lst1 str Str1)或(Str2Lst2 str Str1)
;设通道字符为"|",可以根据个人需求修改str1中不同的字符用"|"分开
;不适用于叠字符和单字符同时存在(比如A和AA同时存在会有问题)
;方案1全部替换成通道符号,按通道符号分解
(defun Str2Lst1(str Str1/ nsllen lst)
(setq s1 (Str2Lst Str1 "|"));设通道字符为"|",可以根据个人需求修改
(setq len (length s1))
(while (> len 0)
(setq len(1- len))
(while (vl-string-search (nth len s1 )str)
(setqstr(vl-string-subst"|" (nth len s1 ) str))
)
)
(setq lst (Str2Lst Str "|"))
(vl-remove-if(function(lambda (n) (= n "")))lst)
)
;方案2全部,查找每一个字符的文字,排序后分解字符串,思路很啰嗦
(defun Str2Lst2 (str Str1/ nsl sx len pos pos0 posxstrx poslist lst)
(setq sl (Str2Lst Str1 "|"))
(setq poslist '())
(foreach sx sl
(progn
(setq len (strlen sx)) ;查找字符长度
(setq strx str)
(setq posx 0)
(while (setq pos (vl-string-search sx strx)) ;查找字符串位置
(setq poslist (cons (vl-list* (+ pos 1 posx) len) poslist)) ;位置和字符长度构成点对,添加到表
(setq posx (+ pos posx len))
(setqstrx (substr strx (+ pos len 1)));新字符串
)
)
)
(setq poslist
(vl-sort poslist (function(lambda (e1 e2) (< (car E1) (car E2)))))) ;位置排序
(setqn 0)
(setqpos0 1)
(while (setqposn (nth n poslist ));取得第n个标识符的位置(2 . 2)
(setq lst (cons (substr str pos0 (- (car posn) pos0)) lst))
;获取1到第一位置的的字符串传到表中
(setq pos0 (+ (car posn) (cdr posn))
n (1+ n)
)
)
(vl-remove-if(function(lambda (n) (= n "")))lst)
(if (/= (setqstr (substr str pos0)) "")
(reverse (cons str lst))
(reverse lst)
)
)
谢谢
来点实例好学习应用
页:
[1]