关于 正则表达式

                 网络编程中正则表达式的使用

 

最近开发涉及到很多网络编程和解析方面的, 使用到正则表达式, 刚开始一看,我晕,乱码啊,这个到底是神马啊。

比如说下面这个东西:

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 />&nbsp;东北风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 />&nbsp;东北风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 />&nbsp;东北风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 />&nbsp;北风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 />&nbsp;北风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日星期一, 很是简单吧,至于这样子做的效率方面,反正就是很快了, 比我们工资花工资的速度快很多很多。

 

其他语句就暂时不解释了。

正则表达式用得好的话, 哪怕你在大海中也能捞上一颗针来,找东西真是方面啊, 当然用不好的话,编译就有问题,怎么弄他都没有反应, 这个多调试,程序都是调试出来的。

 

正则表达式说白了就是程序中找东西的那么一个东西, 如果你要找个什么东西,那么你找它帮忙, 或者你像替换一些东西,它也是很方便的。

 

暂时理解到这里, 以后有新的想法再添加, 大家有不同的意见可以留言

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值