suixin812 发表于 2012-10-25 01:25:10

天气、消息源等WebParser中的正则表达式

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

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

***基本信息
WebParser是用来获得RSS feeds,天气或者其他数据的Plugin,基本格式如下


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都有),它的重要性、创新性、先进性被百度百科吹到天上了,这里就不扯了。


下面用我的一个例子[动漫一句话]


Measure=Plugin
Plugin=Plugins\WebParser.dll
UpdateRate=#UpdateRate#
Url=http://api.hitokoto.us/rand?cat=#cat#&encode=xml&charset=utf-8
RegExp="(?siU).*<id><!\\]></id>.*<hitokoto><!(.*)></hitokoto>.*<catname><!(.*)\]\]></catname>.*<source><!\\]></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>
<!]>
</id>
<hitokoto>
<!]>
</hitokoto>
<cat>a</cat>
<catname>
<!]>
</catname>
<author>
<!]>
</author>
<source>
<!]>
</source>
<like>0</like>
<date>
<!]>
</date>
</result>
以上就是WebPaser通过访问url得到的文本,下面它要用正则表达式进行匹配工作

RegExp="(?siU).*<id><!\\]></id>.*<hitokoto><!(.*)></hitokoto>.*<catname><!(.*)\]\]></catname>.*<source><!\\]></source>"
       (?siU)
这个是RegExp里面的一个“设置”,它告诉WebParser搜索时忽略换行、不区分大小写、非贪婪匹配模式
贪婪模式是指匹配尽可能长的字串,非贪婪模式与之正好相反
例如
<id><!]></id><hitokoto>
同样匹配以“<id>”为开始、以“>”结尾的字符串(RegExp="<id>.*>")
贪婪模式会匹配到“<id><!]></id><hitokoto>”整串字符
而非贪婪模式只会匹配到“<id><!]>”

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

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

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

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

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

就是这样,所以上面这一整行返回的数据为
RegExp="(?siU).*<id><!\\]></id>.*<hitokoto><!(.*)></hitokoto>.*<catname><!(.*)\]\]></catname>.*<source><!\\]></source>"
1                        “ 1318782578 ”
2                        “]”
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

qq420836791 发表于 2012-10-25 13:03:45

我来看看到额,,,

mixhan 发表于 2012-10-25 18:23:31

看到这帖子真是高兴!

mixhan 发表于 2012-10-25 18:45:19

楼主在吗?

suixin812 发表于 2012-10-27 18:20:24

mixhan 发表于 2012-10-25 18:45 static/image/common/back.gif
楼主在吗?

现在在的说,神马事情?

inmyfuturechen 发表于 2012-10-27 20:23:42

强烈支持楼主ing……

mixhan 发表于 2012-10-28 14:19:45

我这天气一直不显示,不知道是什么原因,想问一下~~~~~
加我QQ吧,这样交谈方便一点……59208295

陈王 发表于 2012-10-28 22:23:47

强烈支持楼主ing……

suixin812 发表于 2012-10-29 06:59:33

mixhan 发表于 2012-10-28 14:19 static/image/common/back.gif
我这天气一直不显示,不知道是什么原因,想问一下~~~~~
加我QQ吧,这样交谈方便一点……59208295

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

576660185 发表于 2013-5-4 18:04:43

页: [1] 2
查看完整版本: 天气、消息源等WebParser中的正则表达式