BCB系統使用BOOST

2021-04-13 11:20:46 字數 2722 閱讀 4045

正規表示式是一種模式匹配形式,它通常用在處理的文字程式中。比如我們經常使用的grep工具,還是perl語言都使用了正規表示式。傳統的c++處理正規表示式是非常麻煩的,這也成為很多其他語言愛好者的笑柄,現在情況不一樣了,因為有了boost。

boost是乙個基於template的開發源**庫,在這個庫中有很多子庫用來高效處理各方面的問題,比如字串拆分,格式化,執行緒等等,boost對於每乙個c++愛好者都是應該了解的,對於c++ builder使用者如果能在熟練使用vcl的情況下再熟練使用boost,我想一定如虎添翼。

一般來說,使用boost是非常簡單,和使用其他stl庫沒有太大區別,但使用boost的正規表示式庫則不那麼容易,因為這個庫還需要我們單獨編譯,下面我將詳細介紹如何使用。

[1]解壓到任何你喜歡的目錄,比如d:/boost。

編譯正規表示式庫

前面已經提到,這個庫需要我們單獨編譯才能使用,為什麼不編譯好一起發布呢?主要是考慮到不同的編譯器需要不同的鏈結庫檔案和鏈結庫太大了。在命令列下,進入[%boost]/libs/regex/build目錄,直接敲入make –fbcb6.mak命令開始編譯,這裡請大家注意了,如果你的計算機上同時安裝了bcb5,請一定要把path設定成為bcb6的bcc32.exe程式所在的目錄,否則可能使用bcb5的make程式,這樣雖然能編譯但最後不能使用。

乙個測試程式

在bcb6中建立console程式,編寫下列**:

#include

#include

#include

#include

int main()

設定bcb6 project屬性的lib path和include path為你安裝boost的目錄,執行你會看到結果:

index.html

可以看到index.html已經從字串中提出出來了,那麼為什麼會是這樣呢?

**的核心部分是:

regex expression("//s+href//s*=//s*/"([^/"]*)/"",regbase::normal|regbase::icase);

它用來設定如何匹配字串,上面亂七八糟的字串很難看懂,如果不了解正規表示式的書寫規則,上面**可以和天書媲美。

regbase::normal|regbase::icase 是解析引數設定,具體可以參考boost幫助文件。

正規表示式的書寫規則

. (dot)

用來匹配任何乙個字元,但不包括新行上的字元

*

閉包,任意有限次的自重複連線

+

有限次自重複連線,但至少出現一次

{}

指定可能的重複次數

例如:

ba* 匹配 b ba baa baaa等

ba+ 匹配 ba baa baaaaaaaaa等

ba 匹配 ba baa baaa baaaa baaaaa

/

轉義字元,有很多用途,根據引數設定而變化,最常見的就是類似於c語言/的用法

/s

匹配空格

/w

匹配乙個單詞

/d

匹配數字

()

有兩種用法:

1是合併的作用,例如(ab)*匹配ab abab ababab等

2是確定匹配,也就是說在()中的字元將被最終拆解出來

根據上面這張表,我們可以很容易知道前面的那段天書如何解釋。

乙個實際的例子

前一段時間在csdn上有一篇帖子,問題是有一種檔案結構如(類似):

@people,how are you」 }

問如何拆分字串得到@後面的名字,=兩邊的屬性名和屬性值,引號裡{}種的名字。

解決這個問題用正規表示式再合適不過了。

根據分析,我們可以這樣構造匹配規則:

"@(.*?)/s*//

start=gettickcount()-start;

delete html;

coutcin>>c;

return 0;

}輸出結果為671毫秒,拆分得到1072個width屬性值,我們可以看到boost的效率是非常高的,雖然與一些角本語言比起來解析速度還是慢,但已經可以滿足大多數程式設計要求了。另外作者的計算機配置並不是非常高,相信拿到現在任何一台主流配置的計算機上都會優於作者的結果。

結束語

其實上面的強大威力只是boost的冰山一角,如果你不自己去體會,你很難想象到boost的強大威力。在boost裡還有很多使用的庫,比如格式化輸出,字串拆解,型別轉換等,這些庫使用起來也比較方便,大家可以自行參考boost文件。在這些庫中還有兩個庫需要自行編譯,他們是python和thread庫,而且這些庫的編譯需要專門的工具jam,所以我們在編譯這些庫的時候還要編譯jam工具,而編譯jam工具也不是一件快樂的事情,麻煩同樣出現在如果你安裝了多個編譯器,如果讀者有興趣可以自己試一下。

不過bcb6並不支援全部boost庫,從boost提供的編譯器支援表可以看到

[2] ,bcb6還是有相當多的庫不支援的,支援最好的是gcc/g++的編譯器,但也不是全部支援。希望borland下乙個將要發布的c++編譯器可以支援更多c++標準。

[1]

[2] boost提供的編譯器支援表是針對bcb5的,對於bcb6的支援作者並沒有詳細測試,如果讀者有興趣可以自己測試boost附帶的測試**。

BCB使用小技巧

左 右移 塊 選中 塊 1 ctrl shift i 是整片往右移,2 ctrl shift u 是整片文字往左移 2 得到執行程式的當前路徑 3 迴圈中響應其它操作 4 向外部提供dll函式標準windows格式 extern c declspec dllexport stdcall int32 ...

BCB下使用mysql c api步驟

bcb下使用mysql c api配置步驟 使用mysql c api直接操作mysql資料庫。配置步驟 1 修改mysql.h 找到內容為 if defined win32 defined win64 defined win 的行 大概48行左右,視具體版本而定 在該行下面新增如下行 includ...

使用BCB6 TValueListEditor控制項

tvaluelisteditor控制項可實現類似屬性選擇視窗的功能。當然相比至下功能還是少了很多,不過很多情況下也夠用了。通過過載類函式及控制控制項訊息響應的方式,打造乙個自己滿意的控制項那不是當下我想做的事。在此記錄該控制項的簡單使用方法 1.新增key value對 valuelistedito...