# 【Qt编程】基于Qt的词典开发系列html特殊字符及正则表达式
**1、html特殊字符的显示**
我们知道html语言和C语言一样也有一些特殊字符,它们是不能正常显示的,必须经过转义,在网上可以查到如何显示这些字符,如下图所示:
![](https://box.kancloud.cn/2016-01-15_5698c1c994f19.jpg)
上图给了最常用的特殊字符的显示,下面我们来实验一下:
首先在记事本中写入一句:
~~~
<font color=blue>程序例</font>#include<stdio.h>
~~~
**然后就文本后缀名改为.html后**,用浏览器打开,显示如下:
![](https://box.kancloud.cn/2016-01-15_5698c1c9a97ad.jpg)
我们从上图可以发现include后面没有显示,但是当我们在文本中写入:
~~~
<font color=blue>程序例</font>#include<stdio.h>
或
<font color=blue>程序例</font>#include<stdio.h>
~~~
时就能正常显示了。显示结果如下图:
![](https://box.kancloud.cn/2016-01-15_5698c1c9bb474.jpg)
我们知道Qt能够支持html语言,但是我在编写可以查询c语言函数(肯定有#include后面**。这样就不会当成是特殊字符了,就可以正常显示了。半角和全角的转换只需要点击下图中的第3个按钮:
![](https://box.kancloud.cn/2016-01-15_5698c1c9d359d.jpg)
虽然说,使用全角后看起来不是很协调,但还看得过去,如果读者有什么好的方法,请不吝赐教。
**2、正则表达式**
接着上面的问题继续说,比如我有一个C语言函数词典库,我取其中一段来举例:
~~~
<font color=blue>程序例</font>:<br>#include <span style="color:#ff0000;"><</span>stdio.h <span style="color:#ff0000;">></span><br>#include <span style="color:#ff0000;"><</span> stdlib.h <span style="color:#ff0000;">></span><br>int main(void)<br>
~~~
因为我们需要将上述半角的**,**即字符串中为红色的部分**。当然当文件比较小的时候,可以手动查找替换,但是由于词典一半都有十几M,这时就必须使用正则表达式了。
在Qt中,使用了QRegExp来支持正则表达式。关于正则表达式的语法,网上都有很多教程,我就不细说了。从上面的实例字符串的内容,我们知道包含了几个头文件,所以我们在匹配时,要分别匹配各个头文件两边的半角。我们知道,在正则表达式中,非贪婪模式是由'?'来指定的,但是对于QRegExp类来说,?是不合法的。**在QRegExp中,要使用setMinimal函数来指定贪婪模式**。**setMinimal(true)就是非贪婪模式,setMinimal(false)就是贪婪模式。**
通过上面两部分的讲解,就可以完成C语言函数库词典的显示了。下面通过代码实现,新建Qt Gui应用程序,选择基类为QWidget,其中只需要修改widget.cpp里的内容即可(需要在widget.ui界面中,添加两个label,分别命名为label和label1)。
widget.cpp文件:
~~~
#include "widget.h"
#include "ui_widget.h"
#include<QString>
#include<QRegExp>
#include<QDebug>
#include<QLabel>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
QString str="<font color=blue>程序例</font>:<br>#include <stdio.h ><br>#include < stdlib.h ><br>int main(void)<br>";
ui->label->setText(str); //由于Qt也能识别html格式,而< >是html的特殊字符,因此不处理的话,就会出现显示出错
QRegExp rx("#include (<(.*.h )>)");//正则表达式里的括号是为了获取匹配的内容
rx.setMinimal(true);//非贪婪模式
int pos=0;//从字符串的开始部分
for(int i=0;i<str.size();i++)
{
pos=rx.indexIn(str,0);//得到匹配字符串的位置
while(pos!=-1)//匹配成功
{
str.replace(rx.cap(1),"<"+rx.cap(2)+">");//这里是进行替换,如果不明白rx.cap是什么,可以qDebug显示内容
pos=rx.indexIn(str,pos+rx.matchedLength());//从当前位置,继续往后进行匹配
}
}
ui->label1->setText(str);
}
Widget::~Widget()
{
delete ui;
}
~~~
**程序运行结果如下:**
![](https://box.kancloud.cn/2016-01-15_5698c1c9e3b08.jpg)
**下面放一张查单词软件用到的特殊字符显示和使用正则表达式后的截图:**
![](https://box.kancloud.cn/2016-01-15_5698c1c3b87cf.jpg)
注意:我使用的平台为QT5,如果转移到Qt4上有错的话,可以反向参考[http://qt-project.org/wiki/Transition_from_Qt_4.x_to_Qt5](http://qt-project.org/wiki/Transition_from_Qt_4.x_to_Qt5)
- 前言
- <一>--词典框架设计及成品展示
- <二>--本地词典的设计
- <三>--开始菜单的设计
- <四>--无边框窗口的缩放与拖动
- <五>--无边框窗口的拖动
- <六>--界面美化设计
- <七>--调用网络API
- <八>--用户登录及API调用的实现
- <九>--JSON数据解析
- <十>--国际音标的显示
- <十一>系统托盘的显示
- <十二>调用讲述人
- <十三>音频播放
- <十四>自动补全功能
- <十五>html特殊字符及正则表达式
- 后序