# 【Qt編程】基于Qt的詞典開發系列html特殊字符及正則表達式
**1、html特殊字符的顯示**
我們知道html語言和C語言一樣也有一些特殊字符,它們是不能正常顯示的,必須經過轉義,在網上可以查到如何顯示這些字符,如下圖所示:

上圖給了最常用的特殊字符的顯示,下面我們來實驗一下:
首先在記事本中寫入一句:
~~~
<font color=blue>程序例</font>#include<stdio.h>
~~~
**然后就文本后綴名改為.html后**,用瀏覽器打開,顯示如下:

我們從上圖可以發現include后面沒有顯示,但是當我們在文本中寫入:
~~~
<font color=blue>程序例</font>#include<stdio.h>
或
<font color=blue>程序例</font>#include<stdio.h>
~~~
時就能正常顯示了。顯示結果如下圖:

我們知道Qt能夠支持html語言,但是我在編寫可以查詢c語言函數(肯定有#include后面**。這樣就不會當成是特殊字符了,就可以正常顯示了。半角和全角的轉換只需要點擊下圖中的第3個按鈕:

雖然說,使用全角后看起來不是很協調,但還看得過去,如果讀者有什么好的方法,請不吝賜教。
**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;
}
~~~
**程序運行結果如下:**

**下面放一張查單詞軟件用到的特殊字符顯示和使用正則表達式后的截圖:**

注意:我使用的平臺為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特殊字符及正則表達式
- 后序