网络编程中正则表达式的使用
最近开发涉及到很多网络编程和解析方面的, 使用到正则表达式, 刚开始一看,我晕,乱码啊,这个到底是神马啊。
比如说下面这个东西:
QRegExp rx("<dd>([^<]*)<br[^<]*(<img([^/]*/){7}(\\w+)[^>]*>)(<img([^/]*/){7}(\\w+)[^>]*>)([^>]*>){2}[^\s]([^1234567890-]*)([^<]*)<[^;]*;([^<]*)");
正则表达式的概念就不仔细介绍, 网上很多,也很清晰。
下面只是此人个人观点, 与我本人无关, 如有错漏,也不追究。
所谓正则表达式就是在一堆都字符串中寻找自己需要的数据, 这个难度犹如在茫茫人海中,需找心中的她。
比如有在一篇文章中寻找某个单词, 或者记录这个单词的个数,等等。下面说说此人在天气预报模块中使用到的正则表达式。
<h2><strong>上海天气预报</strong></h2>
<h3>2011-12-12 11时发布</h3>
<div class="days">
<dl style="background:#fff;">
<dd>12月12日星期一<br /> <img src="http://www.weather.com.cn/m/i/icon_weather/21x15/d00.gif" /><img src="http://www.weather.com.cn/m/i/icon_weather/21x15/n01.gif" /></dd>
<dt> 晴转多云10℃/6℃<br /> 东北风3-4级</dt>
</dl>
<dl >
<dd>12月13日星期二<br /> <img src="http://www.weather.com.cn/m/i/icon_weather/21x15/d01.gif" /><img src="http://www.weather.com.cn/m/i/icon_weather/21x15/n01.gif" /></dd>
<dt> 多云13℃/8℃<br /> 东北风3-4级</dt>
</dl>
<dl style="background:#fff;">
<dd>12月14日星期三<br /> <img src="http://www.weather.com.cn/m/i/icon_weather/21x15/d01.gif" /><img src="http://www.weather.com.cn/m/i/icon_weather/21x15/n02.gif" /></dd>
<dt> 多云转阴13℃/7℃<br /> 东北风4-5级</dt>
</dl>
<dl >
<dd>12月15日星期四<br /> <img src="http://www.weather.com.cn/m/i/icon_weather/21x15/d07.gif" /><img src="http://www.weather.com.cn/m/i/icon_weather/21x15/n02.gif" /></dd>
<dt> 小雨转阴11℃/6℃<br /> 北风4-5级</dt>
</dl>
<dl style="background:#fff;">
<dd>12月16日星期五<br /> <img src="http://www.weather.com.cn/m/i/icon_weather/21x15/d01.gif" /><img src="http://www.weather.com.cn/m/i/icon_weather/21x15/n01.gif" /></dd>
<dt> 多云8℃/3℃<br /> 北风4-5级</dt>
我要在上面这些信息中提取这样的信息。
上海,12月12日,星期一,晴转多云,东北风3到4级,最低温度6℃, 最高温度10℃。
当然使用xml 解析类也是可以的, 但是使用正则表达式 代码很简洁,而且可以写到文件中, 程序启动时加载,万一以后网页布局,或者你要解析的文件改变了, 重新写一条语法就可以了,这个是老大说的, 我想应该是这样的把, 不管你信不, 反正我是信了。
主要语法如下(QT的语法,其他语言也是同理)
QRegExprx("<dd>([^<]*)<br[^<]*(<img([^/]*/){7}(\\w+)[^>]*>)(<img([^/]*/){7}(\\w+)[^>]*>)([^>]*>){2}[^\s]([^1234567890-]*)([^<]*)<[^;]*;([^<]*)");
int pos = 0; // where we are inthe string
int count = 0; // how many Ericand Eirik's we've counted
while (-1 != (pos = rx.indexIn(netString, pos)))
{
//pos = rx.indexIn(netString,1);
QString date = rx.cap(1); //月12日星期一
QString iconD = rx.cap(4); //d00
QString iconN = rx.cap(7); // n01
QString weather = rx.cap(9); //晴转多云
QString temprature = rx.cap(10);// 10℃/6℃
QString wind = rx.cap(11); //东北风3-4级
}
当然还可以替换’/’ 为 到 等等,根据需求来再次组织数据。
下面简单解释下这句正则表达式的意思
<dd>([^<]*)<br[^<]*(<img([^/]*/){7}(\\w+)[^>]*>)(<img([^/]*/){7}(\\w+)[^>]*>)([^>]*>){2}[^\s]([^1234567890-]*)([^<]*)<[^;]*;([^<]*)
括号包含的是我们需要的东西rx.cap(1)表示第一个括号。
<dd> :示一直到<dd>
[^<]* :表示一直截取到<符号前的所有数据
<dd>([^<]*)<br: 这个表示<dd>开始到<br 这件的数据, 就是12月12日星期一, 很是简单吧,至于这样子做的效率方面,反正就是很快了, 比我们工资花工资的速度快很多很多。
其他语句就暂时不解释了。
正则表达式用得好的话, 哪怕你在大海中也能捞上一颗针来,找东西真是方面啊, 当然用不好的话,编译就有问题,怎么弄他都没有反应, 这个多调试,程序都是调试出来的。
正则表达式说白了就是程序中找东西的那么一个东西, 如果你要找个什么东西,那么你找它帮忙, 或者你像替换一些东西,它也是很方便的。
暂时理解到这里, 以后有新的想法再添加, 大家有不同的意见可以留言