明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 17585|回复: 34

在VLISP中使用正则表达式(一)取多行文字中的有用内容

  [复制链接]
发表于 2007-1-15 10:29:00 | 显示全部楼层 |阅读模式
我将在以后有空的时间,为大家写一些看起来深一点的知识。
正则表达式,就是使用“Vbscript.RegExp”控件进行文字的查找和替换操作。
普通的文字查找与替换,只能做到替换特定的字符,而不能按照特定的特征进行替换。
例如:一段文字中,需要将“明经通道”几个字都替换为“明经CAD社区”,那直接用替换就可以。
但如果我们有一篇文字,其中需要将“第XX章”全部修改为“第XX节”,而且XX是变化的,需要替换的数量非常多,这时用普通的替换就无能为力了。
这时,我们就得用上正则表达式了。
其实为什么正则表达式在AutoCAD中还没有人提到过使用,那就是因为使用AutoCAD并不是以使用文字为主,所以总少人去研究。但正则表达式在网络编程中使用非常广泛,正如大家看到本站可以大家输入的代码进行语法着色,使用的就是“正则表达式”的功能。呵呵,够强大吧。
在AutoCAD中,也经常会出现象一些明细表、技术要求等之类的文字内容,也会经常碰到过模糊替换的问题。所以多学一些知识是有好处的。
好了,先给大家获取多行文字中的有用字符的LISP代码吧,其实这个代码在几年前已经用VBA解决。而且用LISP的普通代码应该也能解决这样的问题,但如果用正则表达式,则会显得清晰明了。
下一节将会讲一些有关正则表达式的使用方法。
  1. (vl-load-com)
  2. (defun c:m2txt(/ s )
  3.   (setq s "{\\C3;\\{明经通{\\fSimSun|b0|i0|c134|p2;道\\}}\\Lhttp://www.mjtd.com{\\C3;明经通道\\Lhttp{\\C1;://{\\C3;www}.mjtd.com}\\l是一个好网站啊,呵呵}\\l是{\\Ftxt.shx,gbcbig.shx|c134;一个好网站}啊,呵呵}")
  4.   (setq mtext(vlax-ename->vla-object(car(entsel "\n选择多行文字:"))))
  5.   (if (=(vla-get-objectname mtext) "AcDbMText")
  6.     (progn
  7.       (vla-put-textstring mtext s)
  8.       (setq s (vla-get-textstring mtext))
  9.       
  10.       (setq s (mtext2text s))
  11.       (princ "\n")
  12.       (princ s)
  13.       )
  14.     (princ "\n出错")
  15.     )
  16.   (princ)
  17.   )
  18. (defun mtext2text(MTextString / regex s)
  19.   (setq regex(vlax-create-object "Vbscript.RegExp")) ;引用正则表达式控件
  20.   (vlax-put-property regex "IgnoreCase" 0) ;不忽略大小写
  21.   (vlax-put-property regex "Global" 1) ;匹配方式,全文字匹配
  22.   (setq s MTextString)
  23.      ;替换\\字符
  24.   (vlax-put-property regex "Pattern" "\\\\\\\")
  25.   (setq s(vlax-invoke-method  regex "Replace" s (chr 1)))
  26.      ;替换\{字符
  27.   (vlax-put-property regex "Pattern" "\\\\{")
  28.   (setq s(vlax-invoke-method  regex "Replace" s (chr 2)))
  29.      ;替换\}字符
  30.   (vlax-put-property regex "Pattern" "\\\\}")
  31.   (setq s(vlax-invoke-method  regex "Replace" s (chr 3)))
  32.      ;删除段落缩进格式
  33.   (vlax-put-property regex "Pattern" "\\\\pi(.[^;]*);")
  34.   (setq s(vlax-invoke-method  regex "Replace" s ""))
  35.      ;删除制表符格式
  36.   (vlax-put-property regex "Pattern" "\\\\pt(.[^;]*);")
  37.   (setq s(vlax-invoke-method  regex "Replace" s ""))
  38.      ;删除堆迭格式
  39.   (vlax-put-property regex "Pattern" "\\\\S(.[^;]*)(\\^|#|\\\\)(.[^;]*);")
  40.   (setq s(vlax-invoke-method  regex "Replace" s ""))
  41.      ;删除字体、颜色、字高、字距、倾斜、字宽、对齐格式
  42.   (vlax-put-property regex "Pattern" "(\\\\F|\\\\f|\\\\C|\\\\H|\\\\\T|\\\\Q|\\\\W|\\\\A)(.[^;]*);")
  43.   (setq s(vlax-invoke-method  regex "Replace" s ""))
  44.      ;删除下划线、删除线格式
  45.   (vlax-put-property regex "Pattern" "(\\\\L|\\\\O|\\\\l|\\\\o)")
  46.   (setq s(vlax-invoke-method  regex "Replace" s ""))
  47.      ;删除不间断空格格式
  48.   (vlax-put-property regex "Pattern" "\\\\~")
  49.   (setq s(vlax-invoke-method  regex "Replace" s ""))
  50.      ;删除换行符格式
  51.   (vlax-put-property regex "Pattern" "\\\\P")
  52.   (setq s(vlax-invoke-method  regex "Replace" s ""))
  53.      ;删除换行符格式(针对Shift+Enter格式)
  54.   (vlax-put-property regex "Pattern" "\n")
  55.   (setq s(vlax-invoke-method  regex "Replace" s ""))
  56.      ;删除{}
  57.   (vlax-put-property regex "Pattern" "({|})")
  58.   (setq s(vlax-invoke-method  regex "Replace" s ""))
  59.      
  60.      ;替换回\\,\{,\}字符
  61.   (vlax-put-property regex "Pattern" "\\x01")
  62.   (setq s(vlax-invoke-method  regex "Replace" s "\"))
  63.   (vlax-put-property regex "Pattern" "\\x02")
  64.   (setq s(vlax-invoke-method  regex "Replace" s "{"))
  65.   (vlax-put-property regex "Pattern" "\\x03")
  66.   (setq s(vlax-invoke-method  regex "Replace" s "}"))
  67.      
  68.   (vlax-release-object regex)
  69.   s
  70. )
从程序可以看到,多行文字原来的内容是:

其实际文字内容是:
{\\C3;\\{明经通{\\fSimSun|b0|i0|c134|p2;道\\}}\\Lhttp://www.mjtd.com{\\C3;明经通道\\Lhttp{\\C1;://{\\C3;www}.mjtd.com}\\l是一个好网站啊,呵呵}\\l是{\\Ftxt.shx,gbcbig.shx|c134;一个好网站}啊,呵呵}
经过替换后剩下了:
{明经通道}http://www.mjtd.com明经通道http://www.mjtd.com是一个好网站啊,呵呵是一个好网站啊,呵呵

本帖子中包含更多资源

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

x

评分

参与人数 1威望 +1 明经币 +2 金钱 +5 贡献 +5 激情 +5 收起 理由
龙龙仔 + 1 + 2 + 5 + 5 + 5 【好评】好程序 我要回家慢慢研究一下

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2024-8-12 17:33:03 | 显示全部楼层
怎么取多行文字中的  第2行
发表于 2020-11-3 14:25:54 | 显示全部楼层
感谢大神支持!
发表于 2007-1-15 19:56:00 | 显示全部楼层

请问版主,你的程式是否可以支持通配符“*”的替换呢?

比如:把“A1BCD" "A1BBD" "A1BDD"同一使用通配符"A2*D"替换成“A2BCE" "A2BBE" "A2BDE"呢?

如果可以,请大侠指导小弟一把如何使用

谢谢

 

 楼主| 发表于 2007-1-15 21:23:00 | 显示全部楼层
本帖最后由 作者 于 2007-1-15 21:27:38 编辑

这简直是太简单了,因为正则表达式就是专门为这一类的替换设计的:

(defun c:replacetxt(/ regex s txtstring)
  (setq regex(vlax-create-object "Vbscript.RegExp"));引用正则表达式控件
  (vlax-put-property regex "IgnoreCase" 0); 不忽略大小写
  (vlax-put-property regex "Global" 1);全文匹配,而不是只匹配第一处
  (setq txtstring "A1BCD A1BBD A1BDD ")
  (setq s txtstring)
     ;替换字符
  (vlax-put-property regex "Pattern" "A1(.{2})D")
  (setq s(vlax-invoke-method  regex "Replace" s "A2$1E"))
    
  (vlax-release-object regex)
  (princ (strcat "\n替换前为:" txtstring))
  (princ (strcat "\n替换后为:" s))
  (princ)
)

程序运行结果:
命令: REPLACETXT
替换前为:A1BCD A1BBD A1BDD
替换后为:A2BCE A2BBE A2BDE

发表于 2007-1-15 22:57:00 | 显示全部楼层

好,以后多学学

谢谢斑竹

发表于 2007-1-16 14:09:00 | 显示全部楼层

看来,以后要加紧学习了

发表于 2007-1-16 20:25:00 | 显示全部楼层

谢谢版主,会更努力学习的

发表于 2007-1-16 20:49:00 | 显示全部楼层

版主,你的程式好像不好使呀,执行完了没有反应呀

还有(setq txtstring "A1BCD A1BBD A1BDD")

如果需要替换的文字很多,一一写出来比较麻烦的情况下如何解决呢?能不能不用写入"A1BCD A1BBD A1BDD"字符串呢?

如果可以该如何实现呢?麻烦版主多指教。

 楼主| 发表于 2007-1-16 21:22:00 | 显示全部楼层

你来个图形文件给试试,你需要做到什么样的操作,选择文字直接替换还是其它。

其实这只教大家一个方法,其它的可以自己加上去,如选择文字,或选择属性块中的文字,可直接打开文件替换等。这些都可以自己写的。关键要掌握方法。

发表于 2007-1-16 22:06:00 | 显示全部楼层

版主所言甚是,可小弟新手初来乍到,不熟悉,还请多多执教

 

比如我需要把“S3NP33A”改成“S1NP33L”而且类似这样的修改还很多,所以我想请版主帮帮忙,做一个能用通配符"*"的替换lisp的文件,

完成S3*A替换成S1*L而且以*替代的字符串内容不变。如何修改你的程式?请执教

本帖子中包含更多资源

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

x
 楼主| 发表于 2007-1-17 09:22:00 | 显示全部楼层
本帖最后由 作者 于 2007-1-17 13:18:54 编辑
  1. (defun c:reptxt(/ regex s seltext i objtext oldtext)
  2.   (princ  "\n明经通道文本模糊替换示例--将S3*A替换为S1*L")
  3.   (setq seltext(ssget "X" '((0 . "TEXT"))))
  4.   (if  seltext
  5.     (progn
  6.       (setq i 0)
  7.       (setq regex(vlax-create-object "Vbscript.RegExp"));引用正则表达式控件
  8.       (vlax-put-property regex "IgnoreCase" 0); 不忽略大小写
  9.       (vlax-put-property regex "Global" 1);全文匹配,而不是只匹配第一处
  10.       (repeat (sslength seltext)
  11.         (setq objtext(vlax-ename->vla-object (ssname seltext i)))
  12.         (setq s (vla-get-textstring objtext))
  13.         (setq oldtext s)
  14.         ;替换字符
  15.         (vlax-put-property regex "Pattern" "S3(.{4})A")
  16.         (setq s(vlax-invoke-method  regex "Replace" s "S1$1L"))
  17.         (vla-put-textstring objtext s)
  18.         (if (/= oldtext s)
  19.           (progn
  20.             (princ (strcat "\n替换前为:" oldtext))
  21.             (princ (strcat "\n替换后为:" s))
  22.             )
  23.           )
  24.         (setq i(1+ i))
  25.         )
  26.       (vlax-release-object regex)
  27.       )
  28.     )
  29.   (princ)
  30. )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-23 03:12 , Processed in 0.197224 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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