正则表达式(Regular Expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。正则表达式在编程界、增强文本编辑器界家喻户晓,人尽皆知;在办公界、工程设计界则闻者寥寥。知者不惑,受益颇多;不知者无过,没啥损失。
EPLAN作为ECAD领域里的“阆苑仙葩”(注:出自于《红楼梦》的经典词曲《枉凝眉》,指仙界的花草),支持正则表达式不足为奇。不过大多数情况下,客户都用不到它,所以多数人并不知悉它的存在,这么多年来,笔者也就用过不到20回,属于压箱底落灰的状态。
昨天有个客户问了一个问题:在结构标识总览报表中,想要有一列用于显示结构标识符的前缀(也就是前缀和标识符拆分为两列显示),参考下方的“前序符号”列和“代号”列。EPLAN的可选属性虽然多,但找不到所需要的属性。客户为此感到困扰。
单身美女常说“这么多男生,没有一个是我爱的”,此时的客户心里说“这么多属性,没有一个是我要的”。
找不到想要的属性该怎么办呢?昌晖仪表给想了两个办法:简单的办法、高效的办法。简单的意思是动脑少一些;高效的意思是动手少一些。按照《高效能人士的七个习惯》中的观点,“个人永远有选择的自由”、“个人应为自己的选择负责(不怨天不尤人)”。因此,哪种方法适合你,取决于你自己的选择。
方法一:使用一个新的属性
既然找不到现成的可用属性,那我就使用一个另外的属性,比如Structure Description 2<1007>(结构描述2),将其插入到报表表格中。
通过主菜单“项目数据→结构标识符管理”,打开对话框。点击鼠标右键,如标记① ;选择“配置显示”,如标记② ,将属性Structure Description 2<1007>(结构描述2)添加到对话框中。
对于高层代号,这一列的值应该填写等号(=);对于位置代号,这一列的值应该填写(+);对于文档类型,这一列应该填写(&)……填写完成后,更新报表,想要的结果就出来了。
这种方法非常简单,但是有个缺点。比如从别的项目复制了图纸过来,或手工新增了新的结构标识符,要始终记得修改这里的Structure Description 2<1007>(结构描述2),否则报表会有些地方是空缺的。
方法二:使用正则表达式
正则表达式的思路比较简单,找到一个属性,比如Structure identifier <20000> / Complete structure identifier with preceding sign <1003>(结构标识符/带前缀的完整结构标识符),把不需要的部分去除,只保留前缀即可。
打开表格,插入占位符文本,弹出对话框中选择① 格式属性/计算属性,然后选择所需要的属性③ Structure identifier <20000> / Complete structure identifier with preceding sign <1003>(结构标识符/带前缀的完整结构标识符),别忘记激活④ 替代文本,我使用的是“表格10”。
在项目属性中,找到“块属性:替代文本[10]”,把值○│??_??@+=&#+$;│ 粘贴进去,更新报表即可得到想要的结果。
相较于编程语言或增强文本编辑器,EPLAN的正则表达式有点半吊子。那么多好的正则引擎,偏偏它使用了一个很不咋地的ECMAScript。这个引擎支持的语法太少了,不够强大。比如环视(LookAround)是很重要的语法,但EPLAN只支持肯定前视(Positive Lookahead)和否点前视(Negative Lookahead),不支持回顾。
本来按笔者最初想法,可以使用肯定回顾(Positive Lookback)语法(?<=[+=&#]).+$轻松解决,但是不成功,确认半天是语法不支持。这个语法的意思是把[+=&#]后面的内容去掉。最后不得不使用了一个排除表达式[^+=&#]+$,这个表达式有缺陷,如果遇到+A1+LOC1这种多层结构时会有问题,需要重新设计语法,好在这个客户暂时没有多层结构。
期望EPLAN增强正则表达式功能,十年来笔者一直不曾放弃,它可以使得EPLAN更灵活和强大。成功,源自于不放弃!