分享一个字符串左剪切和右剪切的函数
本帖最后由 hubeiwdlue 于 2025-2-25 09:31 编辑(defun wdl_str->lst (string strkey / po strlst xlen)
(setq xlen (1+ (strlen strkey)))
(while (setq po (vl-string-search strkey string))
(setq strlst (cons (substr string 1 po) strlst))
(setq string (substr string (+ po xlen)))
)
(vl-remove "" (reverse (cons string strlst)))
)
;剪切字符串保留左侧部分字符串
;srting,被剪切字符串,dstr,剪切字符,flag控制参数,t返回值不删除dstr本身,nil返回值删除dstr本身
(defun str-left-trim(string dstr flag / newstr1 newstr2 strlst strlst1)
(setq strlst (wdl_str->lst string dstr))
(setq strlst1 (reverse(cdr(reverse strlst))))
(setq newstr1 (apply 'strcat (mapcar '(lambda (x) (strcat x dstr)) strlst1)))
(setq newstr2 (substr newstr1 1 (- (strlen newstr1) (strlen dstr))))
(if flag
newstr1
newstr2
)
)
;剪切字符串保留右侧部分字符串
;srting,被剪切字符串,dstr,剪切字符,flag控制参数,t返回值不删除dstr本身,nil返回值删除dstr本身
(defun str-right-trim(string dstr flag / newstr1 newstr2 strlst strlst1)
(setq strlst (wdl_str->lst string dstr))
(setq strlst1 (cdr strlst))
(setq newstr1 (apply 'strcat (mapcar '(lambda (x) (strcat dstr x)) strlst1)))
(setq newstr2 (substr newstr1 (1+ (strlen dstr)) (strlen newstr1)))
(if flag
newstr1
newstr2
)
)
(str-left-trim "祖//国//万//岁" "//" t);"祖//国//万//"
(str-left-trim "祖//国//万//岁" "//" nil);"祖//国//万"
yjwht 发表于 2025-2-26 19:55
(vl-remove "" (reverse (cons string strlst))); 删除空字符串,两个分隔符之间无字符时出现空字符串!
...
谢谢您提的建议,确实可以不要,默认就是到字符串末尾。上面那个函数是我从论坛收集得,我的理解,这个函数常用的一个场景是按行读取txt文本文档,按字符按空格分开成表,可能有多个空格,清理一下空格,可以防止出现空字符串导致出问题。如果不读取文本,不清理也没问题。 感谢楼主分享,去试试了 刚领会一点。第一段代码的功能是将一个字符串按照指定的分隔键分割成一个字符串列表,并去除列表中的空字符串,如下:
(wdl_str->lst "apple,banana,orange" ",")
("apple" "banana" "orange") 本帖最后由 yjwht 于 2025-2-26 20:06 编辑
(vl-remove "" (reverse (cons string strlst))); 删除空字符串,两个分隔符之间无字符时出现空字符串!
提点小建议,删除框内部分更精简些: 感谢大佬分享
页:
[1]