# 天气、消息源等WebParser中的正则表达式 - Rainmeter技术教程 - 雨滴社区 - Powered by Discuz!
 找回密码
 点击注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 8724|回复: 19

[技术交流] 天气、消息源等WebParser中的正则表达式

[复制链接]

签到天数: 78 天

[LV.6]常住居民II

发表于 2012-10-25 01:25:10 | 显示全部楼层 |阅读模式

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

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

x
天气、消息源等WebParser中的正则表达式[为啥我就发不上Rainmeter技术教程呢?]

正则表达式是一个很深的坑,但作为rainmeter的编写只需要知道很少一部分就可以了。本文的目的在于使正则表达式小白能够勉强看懂WebParser下的RegExp行,并能够适当调整为己用。

***基本信息
WebParser是用来获得RSS feeds,天气或者其他数据的Plugin,基本格式如下
[MeasureWeatherNOW]
Measure=Plugin
Plugin=Plugins\WebParser.dll
Url=http://www.weather.com.cn/data/sk/#CODE#.html
RegExp="{"weatherinfo":{"city":"(.*)","cityid":"(.*)","temp":"(.*)","WD":"(.*)","WS":"(.*)","SD":"(.*)","WSE":"(.*)","time":"(.*)","isRadar":"(.*)","Radar":"(.*)"}}"
UpdateRate=#RATE#
StringIndex=1

Measure行、Plugin行我就不废话了
Url是用来设定访问的地址,可以是http://,也可以是file://(今天才知道)
        http://是网络连接,file://是本地地址
RegExp,正则表达式,待会说
UpdateRate是访问刷新速率,和UpdateDivider差不多。
        区别在于UpdateDivider设小了只会加重你的CPU负担或是干脆让Rainmeter崩溃
        而UpdateRate设小了除了以上两者外,可能会让人家网站因为你过高的访问频率而屏蔽掉你的连接
StringIndex返回的第n个字符串,下面会提到


***正则表达式到底是神马
正则表达式是一种语言,用来在已给定的文本中查找制定的文本,这个查找的过程称为“匹配”
正则表达式据百度说被多种编程语言支持(就连我现在用的notepad2都有),它的重要性、创新性、先进性被百度百科吹到天上了,这里就不扯了。


下面用我的一个例子[动漫一句话]
[MeasureItem1]
Measure=Plugin
Plugin=Plugins\WebParser.dll
UpdateRate=#UpdateRate#
Url=http://api.hitokoto.us/rand?cat=#cat#&encode=xml&charset=utf-8
RegExp="(?siU).*<id><!\[CDATA\[(.*)\]\]></id>.*<hitokoto><!(.*)></hitokoto>.*<catname><!(.*)\]\]></catname>.*<source><!\[CDATA\[(.*)\]\]></source>"
StringIndex=1

Url中#cat#是变量,在这里我设定的值是"a,b,c,d"
也就是说这里访问的完整网络地址是Url=http://api.hitokoto.us/rand?cat=a,b,c,d&encode=xml&charset=utf-8
如果你的浏览器是360浏览器或是谷歌浏览器,打开上述连接就会看到如下内容(绿色部分是随机的)
<result>
<id>
<![CDATA[ 1318782578 ]]>
</id>
<hitokoto>
<![CDATA[ 烦恼这东西,是只有活着的人,才有的特权哦。 ]]>
</hitokoto>
<cat>
a</cat>
<catname>
<![CDATA[ 动画 ]]>
</catname>
<author>
<![CDATA[ 伊达樱 ]]>
</author>
<source>
<![CDATA[ 我们的存在 ]]>
</source>
<like>
0</like>
<date>
<![CDATA[ 2011.10.17 00:29:38 ]]>
</date>
</result>

以上就是WebPaser通过访问url得到的文本,下面它要用正则表达式进行匹配工作

RegExp="(?siU).*<id><!\[CDATA\[(.*)\]\]></id>.*<hitokoto><!(.*)></hitokoto>.*<catname><!(.*)\]\]></catname>.*<source><!\[CDATA\[(.*)\]\]></source>"

       (?siU)
这个是RegExp里面的一个“设置”,它告诉WebParser搜索时忽略换行、不区分大小写、非贪婪匹配模式
贪婪模式是指匹配尽可能长的字串,非贪婪模式与之正好相反
例如
<id><![CDATA[ 1318782578 ]]></id><hitokoto>

同样匹配以“<id>”为开始、以“>”结尾的字符串(RegExp="<id>.*>")
贪婪模式会匹配到“<id><![CDATA[ 1318782578 ]]></id><hitokoto>”整串字符
而非贪婪模式只会匹配到“<id><![CDATA[ 1318782578 ]]>”

                .*
简单理解就是任意字符。
实际上它是由“.”与“*”两部分组成的
“.”是说除前一个字符外任意字符
例如“<.”可以匹配“<a”“<1”“<x”“<5”但匹配不到“<<”
“*”是说前一个字符重复0次或n次
例如“>*”可以匹配“>”“>>”“>>>>>>”,但匹配不到“>i”
“.”和“*”对功能性字符同样有效,也就是说“.*”是说一个点或n个点,也就是任意字符

                \[
这里是指字符“[”而非功能性字符
功能性字符的“[”“]”一句话两句话说不清楚,这里跳过(其实是我忘了T^T)
“\”是标记下一个字符为特殊字符的记号
例如上面的“\[”,把“[”标记为特殊,也就是取消了“[”的功能性,表示只是一个单纯的字符“[”。
一般“\”的作用是把普通字符标记为功能性字符

                (.*)
“.*”的意思上面讲过,这里不再提
“(”“)”的意思是返回括号内的内容,括号外的内容只匹配而不返回
返回的多个字串分别标记为StringIndex=1,2,3,4……

下面我们翻译一下这一行的前半段
RegExp="(?siU).*<id><!\[CDATA\[(.*)\]\]></id>

搜索一个字串,该字串是以任意内容为开端,随后紧接着“<id><![CDATA[”,中间任意内容,并以“]]></id>”结尾的字符。返回中间的“任意内容”,并标记其StringIndex为1

就是这样,所以上面这一整行返回的数据为
RegExp="(?siU).*<id><!\[CDATA\[(.*)\]\]></id>.*<hitokoto><!(.*)></hitokoto>.*<catname><!(.*)\]\]></catname>.*<source><!\[CDATA\[(.*)\]\]></source>"
1                        “ 1318782578 ”
2                        “[CDATA[ 烦恼这东西,是只有活着的人,才有的特权哦。 ]]”
3                        “[CDATA[ 动画 ”
4                        “ 我们的存在 ”

以上不知道你搞明白没,就是这样,在Rainmeter中使用的正则表达式也就这些。

以下链接能帮助你更好的理解WebParser和正则表达式
[技术分享] 喜欢自己编写皮肤的可以进来看看:关于天气、WebParser、正则表达式http://bbs.rainmeter.cn/thread-89945-1-1.html

Tips - WebParser Primer http://bbs.rainmeter.cn/thread-74022-1-1.html
另外可以去看一下百度百科里的“正则表达式”词条 http://baike.baidu.com/view/94238.htm

评分

参与人数 1心动值 +2 活跃值 +10 收起 理由
语笑嫣然 + 2 + 10 刚刚看到,补齐加分

查看全部评分

本帖被以下淘专辑推荐:

回复

使用道具 举报

签到天数: 21 天

[LV.4]偶尔看看III

发表于 2012-10-25 13:03:45 | 显示全部楼层
我来看看到额,,,
回复

使用道具 举报

签到天数: 5 天

[LV.2]偶尔看看I

发表于 2012-10-25 18:23:31 | 显示全部楼层
看到这帖子真是高兴!
回复

使用道具 举报

签到天数: 5 天

[LV.2]偶尔看看I

发表于 2012-10-25 18:45:19 | 显示全部楼层
楼主在吗?
回复

使用道具 举报

签到天数: 78 天

[LV.6]常住居民II

 楼主| 发表于 2012-10-27 18:20:24 | 显示全部楼层
回复

使用道具 举报

签到天数: 2 天

[LV.1]初来乍到

发表于 2012-10-27 20:23:42 | 显示全部楼层
强烈支持楼主ing……
回复

使用道具 举报

签到天数: 5 天

[LV.2]偶尔看看I

发表于 2012-10-28 14:19:45 | 显示全部楼层
我这天气一直不显示,不知道是什么原因,想问一下~~~~~
加我QQ吧,这样交谈方便一点……59208295
回复

使用道具 举报

签到天数: 51 天

[LV.5]常住居民I

发表于 2012-10-28 22:23:47 | 显示全部楼层
强烈支持楼主ing……
回复

使用道具 举报

签到天数: 78 天

[LV.6]常住居民II

 楼主| 发表于 2012-10-29 06:59:33 | 显示全部楼层
mixhan 发表于 2012-10-28 14:19
我这天气一直不显示,不知道是什么原因,想问一下~~~~~
加我QQ吧,这样交谈方便一点……59208295

qq…………那东西我有几年没用了
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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