明经CAD社区

 找回密码
 注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 3075|回复: 13

[基础] 【心得分享】学习正则表达式的一点心得

  [复制链接]
发表于 2013-5-14 13:21 | 显示全部楼层 |阅读模式
本帖最后由 wowan1314 于 2013-8-6 14:14 编辑

     经常听说正则表达式在字符串处理方面的强大。也曾看了下正则的文章。但却被哪些乱七八糟的字符吓退了。

今天上午有时间,特意仔细的学习了下。

发现他并没多数人说的那么复杂。 特将一点心得分享。供初学者参考。。

1、正则表达式就是处理字符串的“提取”与“替换”的。
2、应用方式为VL方法,代码就六句。
     (setq regex(vlax-create-object "Vbscript.RegExp")) ;引用正则表达式控件
  (vlax-put-property regex "IgnoreCase" 0) ;不忽略大小写,1为忽略
  (vlax-put-property regex "Global" 0) ;匹配方式,仅第一个,1为全文
  (vlax-put-property regex "Pattern" N1);制定查找规则N1,N1为正则表达式如:"^[0-9]+",提取文字的数字前缀。
  (setq E2 (vlax-invoke-method  regex "Replace" E1 N2));按规则替换,返回替换后的值。E1为被替换的字符如"9PL1" 。N2为替换字符串如"A-"
  (vlax-release-object regex);释放正则,传说是要释放。
  得到替换后的值E2,你想怎么处理就随便你了。本例返回值为"A-PL1"
3、主要参数N1。这个正则表达式的写法,
    就像是wcmatch后的通配符一样,多看看就会了。起码简单的你肯定能写出来。

今天主要是在看“梁雄啸”的“一刀屠文”的文章了。受益匪浅,感谢之。

但是文章中的两个函数已经不知道哪里可以下载了。所以我模仿的写了个,供大家测试正则表达式的写法。


;;;====================功能 对字符串进行正则表达式提取测试. ===================================正则提取字符.
;;参数: pat = 正则表达式模式 ,对应vbs正则表达式的模式(expression)。说明: \ 号要用 \\ 替代.
;;     str = 字符串
;;     key = "i" "g" "m" , "i"不区分大小写(Ignorecase),"g"全局匹配(Global).”m”多行模式(Multiline),以上几个关键字可以

组合使用,或用""
;;返回: 返回匹配的字符列表,或无一匹配返回nil
(defun XXExP( pat str key / regex S str1)
   (setq regex(vlax-create-object "Vbscript.RegExp")) ;引用正则表达式控件
   (if (wcmatch key "*i*,*I*")
     (vlax-put-property regex "IgnoreCase" 0) ;不忽略大小写
     (vlax-put-property regex "IgnoreCase" 1)
   )
  (if (wcmatch key "*g*,*G*")
     (vlax-put-property regex "Global" 1) ;匹配方式,全文字匹配
     (vlax-put-property regex "Global" 0)
   )
  (if (wcmatch key "*m*,*M*")
     (vlax-put-property regex "Multiline" 1) ;多行模式
     (vlax-put-property regex "Multiline" 0)
   )
   (vlax-put-property regex "Pattern" pat)
   (setq s(vlax-invoke-method  regex "Execute" str));;将规则运用到STR字符,得到提取出的文字内容
   (VLAX-FOR tmp s
     (setq str1 (cons (vlax-get-property tmp "value") str1))
   );;将内容转换为LISP语言就可以直接观察了
  (vlax-release-object regex)
  (REVERSE str1)
)
;;;====================功能 对字符串进行正则表达式替换测试. ===================================正则替换字符.
;;参数: pat = 提取正则表达式模式 ,对应vbs正则表达式的模式(expression)。说明: \ 号要用 \\ 替代.
;;     str = 字符串  STR1替换表达式
;;     key = "i" "g" "m" , "i"不区分大小写(Ignorecase),"g"全局匹配(Global).”m”多行模式(Multiline),以上几个关键字可以

组合使用,或用""
;;返回: 返回替换后的字符串
(defun XXExPR( pat str str1 key / regex S str2)
   (setq regex(vlax-create-object "Vbscript.RegExp")) ;引用正则表达式控件
   (if (wcmatch key "*i*,*I*")
     (vlax-put-property regex "IgnoreCase" 0) ;不忽略大小写
     (vlax-put-property regex "IgnoreCase" 1)
   )
  (if (wcmatch key "*g*,*G*")
     (vlax-put-property regex "Global" 1) ;匹配方式,全文字匹配
     (vlax-put-property regex "Global" 0)
   )
  (if (wcmatch key "*m*,*M*")
     (vlax-put-property regex "Multiline" 1) ;多行模式
     (vlax-put-property regex "Multiline" 0)
   )
   (vlax-put-property regex "Pattern" pat)
  (setq STR2 (vlax-invoke-method  regex "Replace" STR STR1))
  (vlax-release-object regex)
STR2
)
[code="lisp] ;参数 string = 字串      摘自<a href="http://bbs.xdcad.net/space-uid-756.html" target="_blank" class="xw1" style="color: rgb(51, 51, 51); text-decoration: initial; font-weight: 700; font-size: 12px; line-height: 18px; background-color: rgb(229, 237, 242);"><font color="">Love-Lisp</font></a>
;;     Express = 正则表达式
;;     key = 字母 i I m M g G的组合字串
;;          i/I = 忽略大小写 m/M = 多行搜索 g/G = 全文搜索
;;测试 (RegExSearch "晓东CAD" "CA" "g") 返回 ((2 2 "CA"))
(defun RegExSearch (STRING EXPRESS KEY / REGEX S POS LEN STR L)
  (setq RegEx (vlax-create-object "Vbscript.RegExp"))
  (if (and key (WCMATCH key "*g*,*G*"))
    (vlax-put-property regex "Global" 1)
    (vlax-put-property regex "Global" 0)
  )
  (if (and key (WCMATCH key "*i*,*I*"))
    (vlax-put-property regex "IgnoreCase" 1)
    (vlax-put-property regex "IgnoreCase" 0)
  )
  (if (and key (WCMATCH key "*m*,*M*"))
    (vlax-put-property regex "Multiline" 1)
    (vlax-put-property regex "Multiline" 0)
  )
  (vlax-put-property regex "Pattern" ExPress)
  (setq s (vlax-invoke regex 'Execute string))
  (vlax-for o s
    (setq pos (vlax-get-property o "FirstIndex")
          len (vlax-get-property o "Length")
          str (vlax-get-property o "value")
    )
    (setq l (cons (list pos len str) l))
    (princ (strcat "\n文字位置 = "
                   (itoa pos)
                   "  文字长度 = "
                   (itoa len)
                   "  值 = ""
                   str
                   """
           )
    )
  )
  (vlax-release-object RegEx)
  (reverse l)
)[/code]梁雄啸的文章地址:

!强! 在lisp中应用正则表达式
http://bbs.mjtd.com/forum.php?mo ... 1917&fromuid=282351



评分

参与人数 4明经币 +7 金钱 +62 收起 理由
zctao1966 + 1
hpy + 1 + 20 赞一个!
【KAIXIN】 + 2 + 12 赞一个!
Gu_xl + 3 + 30 赞一个!

查看全部评分

本帖被以下淘专辑推荐:

发表于 2013-5-14 15:18 | 显示全部楼层
心得写得简单明了,通俗易懂。感谢分享。
发表于 2013-5-14 19:07 | 显示全部楼层
支持分享thx.
发表于 2013-5-19 16:51 | 显示全部楼层
馋这两个函数好久了,感谢分享
发表于 2013-5-19 22:38 | 显示全部楼层
学习一下,为什么没人顶
发表于 2013-5-19 22:42 | 显示全部楼层
好,支持!
发表于 2013-5-20 09:18 | 显示全部楼层
简短精辟,通俗易懂
发表于 2013-5-20 09:19 | 显示全部楼层
一个字
很好
发表于 2013-5-20 09:28 | 显示全部楼层
还不懂 先收藏
发表于 2014-11-8 21:08 来自手机 | 显示全部楼层
感谢楼主的归纳整理和无私分享!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号  
©2000-2017 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2018-9-26 21:17 , Processed in 0.847630 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表