找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3964|回复: 12

[他山之石] 【心得分享】关于正则表达式应用的一点心得。

[复制链接]
发表于 2013-5-14 13:17:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 wowan1314 于 2013-8-6 14:10 编辑

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

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

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

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

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

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


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

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

组合使用,或用""
;;返回: 返回替换后的字符串
  1. (defun XXExPR( pat str str1 key / regex S str2)
  2.    (setq regex(vlax-create-object "Vbscript.RegExp")) ;引用正则表达式控件
  3.    (if (wcmatch key "*i*,*I*")
  4.      (vlax-put-property regex "IgnoreCase" 0) ;不忽略大小写
  5.      (vlax-put-property regex "IgnoreCase" 1)
  6.    )
  7.   (if (wcmatch key "*g*,*G*")
  8.      (vlax-put-property regex "Global" 1) ;匹配方式,全文字匹配
  9.      (vlax-put-property regex "Global" 0)
  10.    )
  11.   (if (wcmatch key "*m*,*M*")
  12.      (vlax-put-property regex "Multiline" 1) ;多行模式
  13.      (vlax-put-property regex "Multiline" 0)
  14.    )
  15.    (vlax-put-property regex "Pattern" pat)
  16.   (setq STR2 (vlax-invoke-method  regex "Replace" STR STR1))
  17.   (vlax-release-object regex)
  18. STR2
  19. )
  1. ;参数 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>
  2. ;;     Express = 正则表达式
  3. ;;     key = 字母 i I m M g G的组合字串
  4. ;;          i/I = 忽略大小写 m/M = 多行搜索 g/G = 全文搜索
  5. ;;测试 (RegExSearch "晓东CAD" "CA" "g") 返回 ((2 2 "CA"))
  6. (defun RegExSearch (STRING EXPRESS KEY / REGEX S POS LEN STR L)
  7.   (setq RegEx (vlax-create-object "Vbscript.RegExp"))
  8.   (if (and key (WCMATCH key "*g*,*G*"))
  9.     (vlax-put-property regex "Global" 1)
  10.     (vlax-put-property regex "Global" 0)
  11.   )
  12.   (if (and key (WCMATCH key "*i*,*I*"))
  13.     (vlax-put-property regex "IgnoreCase" 1)
  14.     (vlax-put-property regex "IgnoreCase" 0)
  15.   )
  16.   (if (and key (WCMATCH key "*m*,*M*"))
  17.     (vlax-put-property regex "Multiline" 1)
  18.     (vlax-put-property regex "Multiline" 0)
  19.   )
  20.   (vlax-put-property regex "Pattern" ExPress)
  21.   (setq s (vlax-invoke regex 'Execute string))
  22.   (vlax-for o s
  23.     (setq pos (vlax-get-property o "FirstIndex")
  24.           len (vlax-get-property o "Length")
  25.           str (vlax-get-property o "value")
  26.     )
  27.     (setq l (cons (list pos len str) l))
  28.     (princ (strcat "\n文字位置 = "
  29.                    (itoa pos)
  30.                    "  文字长度 = "
  31.                    (itoa len)
  32.                    "  值 = ""
  33.                    str
  34.                    """
  35.            )
  36.     )
  37.   )
  38.   (vlax-release-object RegEx)
  39.   (reverse l)
  40. )


梁雄啸文章地址:

★“一刀屠文”-在lisp中应用正则表达式进行字符处理
http://www.xdcad.net/forum/thread-638533-1-1.html
(出处: 晓东CAD家园-论坛)



评分

参与人数 3威望 +1 D豆 +16 贡献 +2 收起 理由
xshrimp + 5 + 1 技术引导讨论和指点奖!
ScmTools + 1 很给力!
XDSoft + 1 + 10 + 1 好主题奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 19个

财富等级: 恭喜发财

发表于 2013-5-14 20:04:07 | 显示全部楼层
好帖子,楼主请教个问题,我有个MTEXT文本,我想找出所有平方米前面的数字,怎么用正则表达式找出来? 谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-14 23:21:50 | 显示全部楼层
Lisphk 发表于 2013-5-14 20:04
好帖子,楼主请教个问题,我有个MTEXT文本,我想找出所有平方米前面的数字,怎么用正则表达式找出来? 谢谢 ...

把测试字符串发上来!大家的一起研究下!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2013-5-14 23:36:04 | 显示全部楼层
wowan1314 发表于 2013-5-14 23:21
把测试字符串发上来!大家的一起研究下!

谢谢楼主,我一直希望比如能从EXCEL表格里面读取需要的数据,自动修改设计说明,附件的是个简单的例子,以后可以增加更多的替换的。

我希望根据EXCEL的用地面积,总建筑面积替换已经标准化好的说明(MTEXT),第一次可以替换{1}{2}这样的,但是我想替换后标签就没了,如果以后数据变化了,还需要自动的替换应该的位置,怎么办?

这是两个问题。要让程序能找到哪个地方是总用地的,哪个地方是总建筑面积的。

先一个一个来吧,先给讲讲怎么替换吧。清楚后,楼主再给分析分析以后再修改怎么更自动化,谢谢!
QQ截图20130514232931.png

测试DWG图:

请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:test.rar 
下载次数:1  文件大小:11.51 KB 
下载权限: 不限 以上  [免费赚D豆]


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-15 09:46:30 | 显示全部楼层
首先本帖只讨论正则。另外我也是新手。对于LISP读取文件,因为没用到,所以也不知道。

回到你提的这个问题。你的文本是多行文字,一般我都没用过多行文字。其中包括了很多格式符号。
复杂程度远超我的想象,如果是单行文字会简单很多。

你可以用"用地面积(.[^平方米]*)平方米"提取用地面积,然后进行替换。建筑面积的提取也类似写法。
但因为是多行文字所以不晓得哪个字中就会有个奇怪的符号,所以并不精确。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2013-5-15 10:18:37 | 显示全部楼层
学习学习!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2013-5-31 16:13:50 | 显示全部楼层
搞了半天没明白
请教一下,文字处理"A3.2A3.00", 我想尾数加1,变成"A3.2A3.01", 怎么写?

点评

我找到了个正则表达式测试的工具,看看:http://bbs.xdcad.net/thread-668495-1-1.html  详情 回复 发表于 2013-5-31 21:12
用这个"[0-9]$"提取出来,然后对其+1,然后替换掉就行了  详情 回复 发表于 2013-5-31 18:01
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-31 18:01:19 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2013-5-31 16:13
搞了半天没明白
请教一下,文字处理"A3.2A3.00", 我想尾数加1,变成"A3.2A3.01", 怎么写?

用这个"[0-9]$"提取出来,然后对其+1,然后替换掉就行了

点评

给力,好好和葛老学学正则表达式  发表于 2013-5-31 20:59
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-5-31 21:12:54 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2013-5-31 16:13
搞了半天没明白
请教一下,文字处理"A3.2A3.00", 我想尾数加1,变成"A3.2A3.01", 怎么写?

我找到了个正则表达式测试的工具,看看:http://bbs.xdcad.net/thread-668495-1-1.html

点评

这个很不错的工具!!!  发表于 2013-6-1 09:23
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-11-14 21:59:24 | 显示全部楼层
正需要,谢谢楼主分享 真厉害
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-24 16:30 , Processed in 0.316266 second(s), 51 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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