再次求助怎么分离数字与符号?
<p>设一变量</p><p>(setq all "456.23(t5)")</p><p>我想要的结果是得到两得变量:</p><p>(setq sz 456.23)</p><p>(setq wz "(t5)")</p><p>过程是想让456.23加上一个数,比如25.366,等于481.60,然后替换原来的变量all</p><p>即最后的结果是(setq all "481.60(t5)")!</p><p>论坛两位版主曾给小弟指引,也提过"正则表达式".可小弟就是不太懂,弄了一、二天还是没弄好!!!!</p> 菜鸟的想法(setq all "456.23(t5)")
(setq n (strlen all))
(setq sz (atof (substr all 1 (- n 4))))
(setq sz (rtos (+ sz 25.366) 2))
(setq wz (substr all (- n 3) 4))
(setq all (strcat sz wz))
<p>假如(setq all "456.23(t5)")变成</p><p>(setq all "45.11123(t252222)")呢?</p><p>2楼的程序不适用于多种情况!?</p><p></p> <p>以括号"("的位置为界截取吧,</p><p>不知道你处理的字符串有多少种情况,总之要以你的实际情况而定,谁也不好猜测:</p><p>比如你现在的字符是"45.11123(t252222)",也许还会是"45.11123"或"45.11123<tt252222>"等。</p> <p>谢谢各位...我放弃编这个lisp.</p><p>因为多种情况,,按照目前多位版主的解决思路,,,我想要真正解决这个问题..应该有点难度了...</p> <p>确实,想编个专用的还可以,想编个通用的就困难了.</p> 正则表达式,很好很强大! 本帖最后由 作者 于 2008-2-18 22:28:48 编辑 <br /><br /> <p>无痕斑主,能不能用正则表达式帮一下忙:</p><p>我给出三种情况:----------------分离结果:</p><p>(setq all "125.36(T5)")--------(setq sz "125.36");(setq wz "(T5)")</p><p>(setq all "585.360052")---(setq sz "585.360052");(setq wz "")</p><p>(setq all "{T8}125.36<T5>")--(setq sz "125.36");(setq wz1 "{T8}");</p><p> (setq wz2 "<T5>");</p><p></p> 搜索一下正则,按照例子应该能搞定 <p>(defun zgx-find-num (str lst1 / rtn-str rtn-str1 lst) ;rtn-str)<br/> (setq rtn-str ""<br/> rtn-str1 ""<br/> lst nil<br/> )<br/> (while (/= str "")<br/> (if (zgx-singlestr-if-num (zgx-substr str 1 1) lst1)<br/> (progn<br/> (setq rtn-str (strcat rtn-str<br/> (zgx-substr str 1 1)<br/> )<br/> str (zgx-substr str 2 -1)<br/> )<br/> (while<br/> (zgx-singlestr-if-num (zgx-substr str 1 1)<br/> lst1<br/> )<br/> (setq rtn-str (strcat rtn-str<br/> (zgx-substr str 1 1)<br/> )<br/> str (zgx-substr str 2 -1)<br/> )<br/> )<br/> (setq lst (append lst (list rtn-str)))<br/> (setq rtn-str "")<br/> )<br/> (progn<br/> (setq rtn-str1 (zgx-substr str 1 1)<br/> str (zgx-substr str 2 -1)<br/> )<br/> (while<br/> (and<br/> (not (zgx-singlestr-if-num<br/> (zgx-substr str 1 1)<br/> lst1<br/> )<br/> )<br/> (/= str "")<br/> )<br/> (setq rtn-str1 (strcat rtn-str1<br/> (zgx-substr str 1 1)<br/> )<br/> str (zgx-substr str 2 -1)<br/> )<br/> )<br/> (setq lst (append lst (list rtn-str1)))<br/> (setq rtn-str1 "")<br/> )<br/> )<br/> )<br/> lst<br/> )<br/> ;;-----判断是否为英文字符----------------<br/> (defun zgx-singlestr-if-letter (str)<br/> (if (wcmatch str (strcat str "*"))<br/> t<br/> nil<br/> )<br/> )<br/>;;;-----判断单个字母是否为数字,lst ( "+" ".") 需要当作数字处理的符号------<br/> (defun zgx-singlestr-if-num (str lst)<br/> (if (or<br/> (wcmatch str "#")<br/> (member str lst)<br/> )<br/> t<br/> nil<br/> )<br/> )<br/>;;;---判断整个单词是否为数字,lst ( "+" ".") 需要当作数字处理的符号----------<br/> (defun zgx-wholestr-if-num (str lst / yes)<br/> (setq yes t)<br/> (while (and<br/> (/= "" str)<br/> yes<br/> )<br/> (if (zgx-singlestr-if-num (zgx-substr str 1 1) lst)<br/> (setq str (zgx-substr str 2 1))<br/> (setq yes nil)<br/> )<br/> )<br/> yes<br/> )<br/> ;;------字符串长度,汉字按一个字符计算------------------<br/> (defun zgx-strlen (str / m n)<br/> (setq m 0)<br/> (while (/= str "")<br/> (if (zgx-singlestr-if-letter (substr str 1 1))<br/> (setq n 1)<br/> (setq n 2)<br/> )<br/> (setq str (substr str (+ 1 n)))<br/> (setq m (1+ m))<br/> )<br/> m<br/> )<br/> ;;-------取代substr,汉字按一个字符计算,n<0 则substr str m,否则substr m n-----------------<br/> (defun zgx-substr (str m n / mm nn teststr kk str1)<br/> (if (= m 0)<br/> (setq str1 str)<br/> (progn<br/> (setq mm 0<br/> nn 0<br/> )<br/> (repeat (- m 1)<br/> (if (and<br/> str<br/> (/= "" str)<br/> )<br/> (progn<br/> (setq teststr (substr str 1 1))<br/> (if (zgx-singlestr-if-letter teststr)<br/> (setq kk 1)<br/> (setq kk 2)<br/> )<br/> (setq mm (+ mm kk))<br/> (setq str (substr str (1+ kk)))<br/> )<br/> )<br/> )<br/> (setq str1 str)<br/> (repeat n<br/> (if (and<br/> str<br/> (/= "" str)<br/> )<br/> (progn<br/> (setq teststr (substr str 1 1))<br/> (if (zgx-singlestr-if-letter teststr)<br/> (setq kk 1)<br/> (setq kk 2)<br/> )<br/> (setq nn (+ nn kk))<br/> (setq str (substr str (1+ kk)))<br/> )<br/> )<br/> )<br/> (if (>= n 0)<br/> (substr str1 1 nn)<br/> (substr str1 1)<br/> )</p><p> )<br/> )<br/> )</p>
页:
[1]
2