liminnet 发表于 2009-8-29 21:36:00

NetBee 发表于 2009-8-29 22:09:00

正则表达式求

liminnet 发表于 2009-8-30 11:12:00

cmnull 发表于 2009-8-30 15:09:00

刚注册就碰到这个问题,呵呵<br/>最近刚刚为了给标号添加编号而写的,标注数据炸散函数<br/>可以将如 15T32-6,7-250 D.S. 这样的箍筋标注文字分解成 15,"T","6,7",250,"D.S." 然后做成关联表返回<br/><br/>;;; SPL_BE:XP_STPLBL = 分析箍筋标注文本<br/><br/>;;;    Note:<br/>;;;        in     箍筋标注的 e-list<br/>;;;        do    将字符串中的<br/>;;;                对象定义数据        &gt;&gt; (el_elst     &lt;e-list&gt;)<br/>;;;                箍筋根数        &gt;&gt; (i_a     .     a)    ! 还没有箍筋根数时,a 的值保存为 0<br/>;;;                T/Y            &gt;&gt; (str_b     .     b)<br/>;;;                箍筋直径         &gt;&gt; (i_c     .     c)<br/>;;;                箍筋编号前面的'_'    &gt;&gt; (pos_d1     .     d1)<br/>;;;                箍筋编号        &gt;&gt; (str_d     .     d)    ! 还没有箍筋编号时,d 的值保存为 "" 空字符串<br/>;;;                箍筋间距前面的'_'    &gt;&gt; (pos_d1     .     d1)<br/>;;;                箍筋间距        &gt;&gt; (i_e     .     e)<br/>;;;                箍筋肢数        &gt;&gt; (str_f     .     f)<br/>;;;            分析出来,放入关联表中        &gt;&gt; (    (str_f . f)<br/>;;;                                (i_e . e)<br/>;;;                                (str_d . d)<br/>;;;                                (i_c . c)<br/>;;;                                (i_a . a)<br/>;;;                                (str_b . b)<br/>;;;                                (pos_e1 . e1)<br/>;;;                                (pos_d1 . d1)<br/>;;;                                (el_elst     &lt;对象定义数据&gt;)<br/>;;;                               )<br/>;;;        return    返回以上分析所得的关联表,供后续使用<br/><br/><br/>(defun SPL_BE:XP_STPLBL    (<br/>             xpstplbl:elStpLbl<br/>             /<br/>             xpstplbl:strStpLbl<br/>             xpstplbl:lstReturn<br/>             xpstplbl:strStpLbl_b<br/>             xpstplbl:posStpLbl_b<br/>             xpstplbl:posStpLbl_d1<br/>             xpstplbl:posStpLbl_e1<br/>            )<br/>    (setq<br/>    xpstplbl:strStpLbl                                        ; STEP.1 &gt;&gt; 从 e-list 中提取文本信息<br/>       (vl-string-trim ;_必要的处理,移除前导和后导的空格和“-”连字符<br/>           " -"<br/>           (cdr (assoc 1 xpstplbl:elStpLbl))<br/>       )<br/><br/><br/>    xpstplbl:lstReturn                                        ; STEP.2 &gt;&gt; 将 e-list 保存进结果关联表<br/>       (cons (cons 'el_elst<br/>               xpstplbl:elStpLbl<br/>         )                                            ;     构造点对表 &gt;&gt; (el_elst . elst)<br/>         nil<br/>       )                                                ;     初始化结果关联表 &lt;&lt; ((el_elst . elst))<br/><br/>    xpstplbl:lstReturn                                        ; STEP.3 &gt;&gt; 提取第一个 "-" 的位置号 (posstion = displacement + 1)<br/>       (cons (cons 'pos_d1<br/>               (setq xpstplbl:posStpLbl_d1<br/>                (1+ (vl-string-position<br/>                    (ascii "-")<br/>                    xpstplbl:strStpLbl<br/>                    )<br/>                )<br/>               )<br/><br/>         )                                            ;     构造点对表 &gt;&gt; (pos_d1 . d1)<br/>         xpstplbl:lstReturn<br/>       )                                                ;     更新结果关联表 &lt;&lt; ((pos_d1 . d1) (el_elst . elst))<br/><br/>    xpstplbl:lstReturn                                        ; STEP.4 &gt;&gt; 提取第二个 "-" 的位置号 (posstion = displacement + 1)<br/>       (cons (cons 'pos_e1<br/>               (setq xpstplbl:posStpLbl_e1<br/>                (1+ (vl-string-position<br/>                    (ascii "-")<br/>                    xpstplbl:strStpLbl<br/>                    nil<br/>                    t<br/>                    )<br/>                )<br/>               )<br/><br/>         )                                            ;     构造点对表 &gt;&gt; (pos_e1 . e1)<br/>         xpstplbl:lstReturn<br/>       )                                                ;     更新结果关联表 &lt;&lt; ((pos_e1 . e1) (pos_d1 . d1) (el_elst . elst))<br/><br/>    xpstplbl:lstReturn                                        ; STEP.5 &gt;&gt; 提取 b 值 &lt;&lt; 箍筋标注用 T 还是 Y 筋<br/>       (cons (cons 'str_b<br/>               (setq xpstplbl:strStpLbl_b<br/>                (cond<br/>                    ((wcmatch xpstplbl:strStpLbl "*##*")<br/>                     "Y"<br/>                    )<br/>                    (t "T")<br/>                )<br/><br/>               )<br/>         )                                            ;     构造点对表 &gt;&gt; (str_b . b)<br/>         xpstplbl:lstReturn<br/>       )                                                ;      更新结果关联表 &lt;&lt; ((str_b . b) (pos_e1 . e1) (pos_d1 . d1) (el_elst . elst))<br/><br/>    xpstplbl:posStpLbl_b                                        ; STEP.6 &gt;&gt; 保存标注 T/Y 的位置号,以供后提取 a,c 的值时使用<br/>       (1+ (vl-string-position<br/>           (ascii xpstplbl:strStpLbl_b)<br/>           xpstplbl:strStpLbl<br/>           )<br/>       )<br/><br/>    xpstplbl:lstReturn                                        ; STEP.7 &gt;&gt; 提取 a 的值 &lt;&lt; 箍筋根数,如果没有则为 0<br/>       (cons (cons 'i_a<br/>               (cond<br/>               ((wcmatch xpstplbl:strStpLbl "*") 0)<br/>               (t<br/>                (atoi<br/>                (substr    xpstplbl:strStpLbl<br/>                    1<br/>                    (- xpstplbl:posStpLbl_b<br/>                       1<br/>                    )<br/>                )<br/>                )<br/>               )<br/>               )<br/>         )                                            ;     构造点对表 &gt;&gt; (i_a . a)<br/>         xpstplbl:lstReturn<br/>       )                                                ;     更新结果关联表 &lt;&lt; ((i_a . a) (str_b . b) (pos_e1 . e1) (pos_d1 . d1) (el_elst . elst))<br/><br/>    xpstplbl:lstReturn                                        ; STEP.8 &gt;&gt; 提取 c 的值 &lt;&lt; 箍筋直径<br/>       (cons (cons 'i_c<br/>               (atoi<br/>               (substr xpstplbl:strStpLbl<br/>                   (1+ xpstplbl:posStpLbl_b)<br/>                   2<br/>               )<br/>               )<br/>         )                                            ;     构造点对表 &gt;&gt; (i_c . c)<br/>         xpstplbl:lstReturn<br/>       )                                                ;     更新结果关联表 &lt;&lt; ((i_c . c) (i_a . a) (str_b . b) (pos_e1 . e1) (pos_d1 . d1) (el_elst . elst))<br/><br/>    xpstplbl:lstReturn                                        ; STEP.9 &gt;&gt; 提取 d 的值 &lt;&lt; 箍筋编号,如果没有则为空字符串 "" ,不包括前面的 "-"<br/>       (cons (cons 'str_d<br/>               (cond<br/>               ((= xpstplbl:posStpLbl_d1 xpstplbl:posStpLbl_e1) "")<br/>               ;; ((= (- xpstplbl:posStpLbl_e1 xpstplbl:posStpLbl_d1) 1) "")<br/>               ;; 此逻辑不需要,如果两个'-'紧邻,则长度参数为 0,substr 自然返回 ""<br/>               (t<br/>                (substr xpstplbl:strStpLbl<br/>                    (1+ xpstplbl:posStpLbl_d1)<br/>                    (- (- xpstplbl:posStpLbl_e1 xpstplbl:posStpLbl_d1) 1)<br/>                )<br/>               )<br/>               )<br/>         )                                            ;     构造点对表 &gt;&gt; (str_d . d)<br/>         xpstplbl:lstReturn<br/>       )                                                ;     更新结果关联表 &lt;&lt; ((str_d . d)(i_c . c) (i_a . a) (str_b . b) (pos_e1 . e1) (pos_d1 . d1) (el_elst . elst))<br/><br/>    xpstplbl:lstReturn                                        ; STEP.10 &gt;&gt; 提取 e 的值 &lt;&lt; 箍筋间距,不包括前面的 "-"<br/>       (cons (cons 'i_e<br/>               (atoi (substr xpstplbl:strStpLbl<br/>                     (1+ xpstplbl:posStpLbl_e1)<br/>                     3<br/>                 )<br/>               )<br/>         )                                            ;     构造点对表 &gt;&gt; (i_e . e)<br/>         xpstplbl:lstReturn<br/>       )                                                ;     更新结果关联表 &lt;&lt; ((i_e . e) (str_d . d) (i_c . c) (i_a . a) (str_b . b) (pos_e1 . e1) (pos_d1 . d1) (el_elst . elst))<br/><br/>    xpstplbl:lstReturn                                        ; STEP.11 &gt;&gt; 提取 f 的值 &lt;&lt; 箍筋肢数,不包括前面的空格<br/>       (cons (cons 'str_f<br/>               (substr xpstplbl:strStpLbl<br/>                   (+ xpstplbl:posStpLbl_e1 5)<br/>                                                    ;     箍筋标注中空格的位置不用计算,可以从 e1 的位置推算出来 = e1 + 4 <br/>               )<br/>         )                                            ;     构造点对表 &gt;&gt; (str_f . f)<br/>         xpstplbl:lstReturn<br/>       )                                                ;      更新结果关联表 &lt;&lt; ((str_f . f) (i_e . e) (str_d . d) (i_c . c) (i_a . a) (str_b . b) (pos_e1 . e1) (pos_d1 . d1) (el_elst . elst))<br/>    ) ;_ setq 调用结束<br/>)<br/>

tengte 发表于 2009-8-30 23:22:00

回9楼:我的函数是为我在程序中的特定功能写的,满足我需要的功能即可,拿出来分享,只是作为一个参考。你提的问题很没有水平,后面的“-”既可理解为负号,也可理解为连接符号,如果你懂编程,我想要稍微修改一下程序即可实现,当然前提你要懂编程序。

liminnet 发表于 2009-8-31 00:41:00

页: 1 [2]
查看完整版本: [求助]如何提取比如“"P1-60"”中的60和“P1-”