(defun StrType(a / b c d e);;字符串分离全角、符号、字母、数字,存在问题:连续小数点与数字相连不能精确分离数字和小数点
(setq b(vl-string->list a))
(while b
(setq a(car b)b(cdr b)c(last d))
(if(or(not d)
(and(< 0 a 32)(< 0 c 32));;非打印字符
(or(= 46 a)(= 46 c)(and(< 47 a 58)(< 47 c 58)));数字和小数点
(vl-every'(lambda(x)(vl-some'(lambda(y)(<(car y)x(cadr y)))'((31 48)(57 65)(90 98)(122 129))))(list a c));其它字符包括小数点
(vl-every'(lambda(x)(vl-some'(lambda(y)(<(car y)x(cadr y)))'((64 91)(96 123))))(list a c));;字母
(and(> a 128)(> c 128)));;全角字符
(if(> a 128)(setq d(vl-list*(car b)a d)b(cdr b))(setq d(cons a d)))
(setq e(cons(reverse d)e)d(if(> a 128)(list(car b)a)(List a))b(if(> a 128)(cdr b)b))))
(mapcar'vl-list->string(reverse(cons(reverse d)e))))
(vl-remove-if-not 'distof(StrType"免币123交流4.56收费78有理"))=>("123" "4.5" "678") 连查看内容都要付费?跟百度学的吗? 一行代码就能解决 这就很........ 佛祖也不纯了 没看到诚意 本帖最后由 shiy65 于 2024-1-23 13:27 编辑
逻辑有点复杂
说个简单点的办法,
1. 定义一个判据函数strT
如果 单个字符串 s 属于 “数字” “小数点” 则返回 “T",否则返回 “nil “
2. 对输入的字符串,从左向右依次提取每一个字符,判断是否是 T
记录每个符合要求的字符的起始位置(从左边开始计数的位置),
和连续符合条件的字符长度,
生成一个字符串提取记录表,列入总记录表,直至字符串最后一个字符为止
3. 按照总提取记录表的提取记录,依次提取,列入提取数字记录表,完成提取。
页:
[1]
2