前两天,有这样一个项目。
实现<html> ...</html>文本文件中,提取其中的<img .../>的路径,并将其提取来的http....png图片替换回去。
替换前:
<html>
...
<img src="http://www.vxweb.cn" />
<img src="http://www.firstwx.cn" />
...
</html>
替换后:
<html>
...
http://www.vxweb.cn
http://www.firstwx.cn
...
</html>
构思:
1.先把<img/>,用正则表达式提取出来并且形成一个list数组(libReferenceIMG)
2.将http.,用正则表达式提取出来并且形成一个list数组(libReferenceHTTP)
3.然后将libReferenceIMG中的数据进行匹配后,将libReferenceHTTP的数据赋给libReferenceIMG,就成了。
解:
QList<QString> RegularExpression::getAllMatchResults3( QString text)
{
QString str = text;
QList<QString> libReference2,libReference4 ;
for (int i=0;i<=libReferenceIMG.count()-1;i++)//libIMG包含<img/>
{
libReference2.clear();//清空数组
libReference2 = str.split(libReferenceIMG.at(i));//将数组进行指定字符分割
libReference4 << libReference2.at(0);//添加数组中的第一个数据
libReference4<<libReference3.at(i);//添加当前分割字符
str = libReference2.at(1);//之前截取的字符不要了,下次从下一个字符开始从新检测
if(i == libReferenceIMG.count()-1&&libReference2.at(1)!=NULL)//如果代码是以非<img/>结尾,最后一个字符也需要加到这个新数组中
{
libReference4 << libReference2.at(1);
}
}
return libReference4;//返回这个分割后的数组
}
是不是看起来非常的神奇,没有任何提示。完美编译,结果提示我有问题,我能有问题???
这么完美的代码提示我错误???结果我某某翻译了一下,发现数组越界。
然后找哪里越界了,结果发现,当我处于第0位数据的时候,我是没有权限访问下一位数据的,因为它有可能根本就不存在。什么指针?什么数组?不重要,就是干。
数组越界后,我就开始更换新的方法replace(需要替换的数据,替换的数据);
for (int i =0;i<=libReference4.count()-1;i++)//刚才返回的数组,全部数据
{
for(int j =0;j<=libReferenceIMG.count()-1;j++)//IMG数组
{
if(libReferenceIMG.at(i).contains(libReferenceHTTP.at(j),Qt::CaseInsensitive))
{
libReference4.replace(libReferenceIMG.at(i),libReferenceHTTP.at(i));
}
}
}
编译过了,我可是真是小天才,这也太简单了吧。23333. 让我ctrl+r起飞一下
结果不好使,我的小天才怎么了???难道是因为早上没有去我工作室的官网逛一逛“www.vxweb.cn”。百度了一下,发现是数组的数值是常量,然后我们需要的是变量数组。我笑了,突然之间悔恨的泪水滑过了我的脸颊,难道我这一天的努力白费了么?
冷静下来,喝了口水。发现....忘记冲茶叶了。淦
其实仔细想想我们的解题思路就是有问题的,我们应该在第二部结束的时候直接就将文字插进去然后然后按照指定的字符进行分割。
QList<QString> RegularExpression::getAllMatchResults3( QString text)
{
QString str =text;
QList<QString> qlqs;
for ( int i =0;i<=libReferenceIMG.count()-1;i++)
{
str.replace(libReferenceIMG.at(i),"XinYiNET"+libReferenceIMG.at(i)+"XinYiNET");
}
for(int j=0;j<=libReferenceHTTP.count()-1;j++)
{
str.replace(libReferenceIMG.at(j),libReferenceHTTP.at(j));
}
qlqs =str.split("XinYiNET", QString::SkipEmptyParts);
libReference4 = qlqs;
for ( int i =0;i<=qlqs.count()-1;i++)
{
//qDebug()<<qlqs.at(i);
}
qDebug()<<qlqs.count();
return qlqs;
}
其实出现这个问题的原因特别简单,就是我们一直想减少我们的代码,进而最简化的需要处理的字符串。但是我们却忽略了,如果我们去主动增加分隔符会更容易解决这个问题。
这就是一个经验,有时候我们需要逆向思维。加油,程序员。