# Rm中巧用正则表达式和替换 - Rainmeter技术教程 - 雨滴社区 - Powered by Discuz!
 找回密码
 点击注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 5986|回复: 5

[技术交流] Rm中巧用正则表达式和替换

[复制链接]

签到天数: 166 天

[LV.7]常住居民III

发表于 2013-1-23 02:40:53 | 显示全部楼层 |阅读模式

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

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

x
我们先介绍一下什么是Substitute?
Substitute是在measure下面用来建立一些字符来替代其他指定的所有字符的选项,当我们结合正则替换(RegExpSubstitute)选项之后,那么正则表达式可以使用在substitute里面.
下面是一个例子:
  1. [MeasureYear]
  2. Measure=Time
  3. Format=%Y
  4. Substitute="2012":"Twenty Twelve","2013":"Twenty Thirteen","2014":"Twenty Fourteen"
复制代码
下面介绍一下基本的应用
一系列由分号分割的类似于”查找到的”:”被替换的”,这样的一串串的东西可以使用在measure下面改变字符,注意你比寻用引号引起来,例如: Substitute="cat":"dog",将会把在相应measure里面监测到的所有找到的”cat”字符串替换为”dogs”,你可以写多个这样,的替换,比如: Substitute="red":"green","blue":"yellow",这个是将”red”替换我”green”,”blue”替换为”yellow”.
当一个meausure在一个meter里面利用measurename= 这个选项选定之后,substitute(替换后)的值将会被启用.
例子如下:
  1. [MeasureYear]
  2. Measure=Time
  3. Format=%Y
  4. Substitute="2012":"Twenty Twelve"

  5. [MeterYearText]
  6. Meter=String
  7. MeasureName=MeasureYear
复制代码
那么上面的 MeterYearText 这个meter将会显示” Twenty Twelve”

当一个measure直接被其他的一个meter或者measure使用的时候,例如,在一个measure=calc 的measure里面,这个被替换后的值只有被”[”,”]”闭合起来而且meter或者相应的measure里面设施了动态变量之后才有效,不然,替换之前的原值将会呗启用,替换失败.
比如下面一个例子:
  1. [MeasureYear]
  2. Measure=Time
  3. Format=%y
  4. Substitute="12":"Twenty Twelve"

  5. [MeasureYearNumber]
  6. Measure=Calc
  7. Formula=(2000 + MeasureYear)

  8. [MeterYearText]
  9. Meter=String
  10. Text=[MeasureYear]
  11. DynamicVariables=1
复制代码
这个也是一样 MeasureYearNumber会返回2012而且MeterYearText将会显示的是” Twenty Twelve”.
替换是从左向右进行的,是有顺序和有迭代性质的,换句话讲,第一次替代后的,如果在第二次里面是一个被查找的字符串,那么这个刚替换的字符会参与第二次替换,如此循环,所以说呢,你确定一个好的替换顺序是十分的重要的东西,通过定义一个查找方式使之不至于出现意外的改变.
比如:
Substitute="1":"2","10":"3","100":"4"
这个语句不会返回你所期待的东西,第一,替换将把所有的字符”1”替换为”2”,这个意味着”10’和”100”将不会被查找到,因为他们都被替换成为了”20”和”200”了,这个
可以通过定义替换的顺序老解决这个问题,比如下面的例子 :
Substitute="100":"4","10":"3","1":"2"

有时候呢,你可能需要替换引号字符,这个可以通过被双引号围起来的方式解决这个问题,比如Substitute='"':"",这个将会将双引号替换为空,相反的Substitute="None":'"'这个会将字符”None”会被替换为双引号,然而Substitute='"':'None',这个是不行的,因为你不能再”:” 符号的两端都是用单引号,一个简单的例子是: Substitute='red':'blue',这个也是不行的.

下面讲讲十分重要而且有用的正则替换
当这个置为1的时候,那么就允许使用正则表达式在替换字符的时候,满足正则匹配条件的源字符串将会被替换为冒号之后的字符串,原理和上面的一样,只是这里可以使用正则表达式了而已.
下面介绍几个例子吧:
替换两个数字构成的字符串为”it works”,将开头的两个字符串替换为”this”
RegExpSubstitute=1
Substitute="\d\d":"It Works","^..":"This"
掩码IP地址
192.168.1.101
RegExpSubstitute=1
Substitute="^(\d{1,3}).(\d{1,3}).(\d{1,3}).\d{1,3}$":"\1.\2.\3.***"
上面就会返回 192.168.1.***
说明一下上面的意思:^表示字符的开头,$表示字符结尾,( )括起来的东西可以再后面用\n引用比如上面的例子里面就用到了,注意\n是按()出现的顺序一一对应的,很简单的东西,\d表示匹配一个数字类型的,{1,3}表示匹配的个数是1个到3个之间包含1和3,就是这样.

截断字符串并且追加”…”:
比如” Cloudy with chance of rain”
RegExpSubstitute=1
Substitute="^(.{11,}).+$":"\1..."
结果为Cloudy with...
解析一下上面的替换, . 表示的是任意一个字符串,{11,},这个指明了截取最小的字符数量就是11,后面替换为”\1…”意思是将这个字符串的第11个字符之后的所有的字符替换为…,并且保留前11个字符

下面将一个应用的例子:
  1. [Rainmeter]
  2. Update=1000

  3. [Variables]
  4. ImagePath=F:\我的图片\奇闻异图
  5. SubFolders=1
  6. FileFilter=*.jpg;*.jpeg;*.png;*.bmp
  7. UpdateRate=2

  8. [mPic]
  9. Measure=Plugin
  10. Plugin=Plugins\QuotePlugin.dll
  11. PathName=#ImagePath#
  12. FileFilter=#FileFilter#
  13. Subfolders=#SubFolders#
  14. UpdateDivider=#UpdateRate#
  15. Disabled=0

  16. [FileName_Ext]
  17. Measure=TIME
  18. Format=[mPic]
  19. DynamicVariables=1
  20. RegExpSubstitute=1
  21. Substitute="\\(.*)\":"","^.:":"","...\D$":""
  22. UpdateDivider=#UpdateRate#
  23. Disabled=0

  24. [mSlideshow]
  25. Meter=IMAGE
  26. MeasureName=mPic
  27. MeasureName2=FileName_Ext
  28. X=0
  29. Y=0
  30. W=250
  31. Hidden=0
  32. ToolTipText=" %2"
  33. ToolTipType=0
  34. UpdateDivider=#UpdateRate#
复制代码
说明一下,这个例子,这个里面用到了我们说到的正在表达式替换,关于正则表达式我不想过多的讲,因为很多新人都用不上,我只简单的讲讲上面的相应的正则表达式的意思是神马,你关键要看的是这个节点下面的内容,like:
  1. [FileName_Ext]
  2. Measure=TIME
  3. Format=[mPic]
  4. DynamicVariables=1
  5. RegExpSubstitute=1
  6. Substitute="\\(.*)\":"","^.:":"","...\D$":""
  7. UpdateDivider=#UpdateRate#
  8. Disabled=0
复制代码
有的人会说了,怎么可以这么弄,这不是一个时间类型的measure么?
是的,但是我可以告诉你的是这个是可以的,RM给了字符串处理的measure其实就是TIME这个类型的measure,因为它的格式可以又我们自己定义的,至于数字的处理一般用calc,注意也是可以用正则表达式替换的,你可以用这个做到更多的东西.好的回归正题了,由于这个引入的是一个文件名称,要用正则表达式即时的处理那么就要DynamicVariables=1这句什么意思不用说了吧,由于我们要使用正则表达式替换那么就要RegExpSubstitute=1,之后呢?我们可以再这里写我们的正则表达式了, 现在我们看这句:
Substitute="\\(.*)\\":"","^.:":"","...\D$":""
这句是什么意思?

这句很简单,我举一个例子:
比如你有一个图片文件的完整路径是:c:\mydocument\images\demo.png
那么\\(.*)\\  就可以表示 \mydocument\images\  说明一下\\(.*)\\,其实它是由几个部分构成的 \\ 和(.*)之后又是一个\\   ,\\是什么意思呢 ?这个表示一个反斜杠(\)的直接字面量,意思就是它就直接表示这个反斜杠而已,那么为什么要写两个反斜杠呢?因为反斜杠是一个有特殊用途的特别字符,因而使用的时候要转义, 转义的意思就是将一个有特殊功能的字符转换为这个字符的字面量本身,就是这么简单,那么,(.*)什么意思呢?它表示匹配一个或者多个字符,你只要懂得的是这里将”\mydocument\images\”这部分置为空,下面说说^.:这句什么意思?^是一个起始符号,写了这个表示从一个字符串开头开始匹配,是在不懂也没有关系,我将一下在这里的用途,这里就是将”C:”这个字符串置为空,” ...\D$”的意思也很简单,因为你懂的一个图片类型的文件后缀都是.xxx构成的就是说由4个字符构成,并且在结尾,那么”$”这个就是表示从结尾匹配的,”…\D$”表示的正是这个图片文件夹的后缀名称,\D表示出了数字之后的一切字符,懂了吧,很简单是不是?那么你会了这个之后你就可以得到一个图片的文件名称,如果你将正则改变一下成为Substitute="\\(.*)\\":"","^.:":"" 那么就会显示文件名称和文件的后缀,同理你可以做更多的尝试.如果你会正则表达式那么你可以做更多…



回复

使用道具 举报

签到天数: 8 天

[LV.3]偶尔看看II

发表于 2013-1-27 00:08:15 | 显示全部楼层
楼主辛苦了
回复

使用道具 举报

签到天数: 136 天

[LV.7]常住居民III

发表于 2013-1-27 21:15:38 | 显示全部楼层
楼主幸苦了,赞一个
回复

使用道具 举报

签到天数: 86 天

[LV.6]常住居民II

发表于 2013-1-28 11:35:02 | 显示全部楼层
辛苦辛苦~~
回复

使用道具 举报

576660185 该用户已被删除
发表于 2013-5-4 17:58:05 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

签到天数: 246 天

[LV.8]以坛为家I

发表于 2017-4-5 09:06:57 | 显示全部楼层
楼主,还在不在玩雨滴啊



---------------------------------------------------------------------------------------------------------------------

yuxiubi于2017-4-5 09:07补充以下内容:
我想请教你一下问题

---------------------------------------------------------------------------------------------------------------------
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点击注册

本版积分规则

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