- UID
- 335199
- 主题
- 注册时间
- 2012-9-25
- 在线时间
- 小时
- 最后登录
- 1970-1-1
签到天数: 78 天 [LV.6]常住居民II
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?点击注册
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
|
评分
-
查看全部评分
|