妳也懂 REGEX ?

來到這裡的朋友們,想必也知道 REGEX 是什麼了吧!今天我們要豪洨說明的就是 BOOST 函式庫裡面的 REGEX 函式庫啊!當然,這玩意個函式庫不是三言兩語就能說得完,所以先從最簡單的部份開始摟。



要撰寫使用 REGEX 函式庫的程式,我們需要的材料有:
  1. 已經編譯好的函式庫檔案
  2. 標頭檔 
不清楚如何取得上述兩項的朋友們,請參考這邊的說明。有了上述兩樣東西,就可以開工摟!

首先,我們需要將 REGEX 函式庫連結以及在我們的程式裡面引入 "boost/regex.hpp" ,接下來就可以開始撰寫程式。

要使用 REGEX 來搜尋字串,其實也不外乎幾個東西:
  1. 要被搜尋的字串
  2. 正規表示法
  3. 搜尋的結果
  4. 搜尋的演算法 (完全符合,部份符合)
所以我們需要在程式裡面先建立好這三個項目,而這三個項目分別對應到:
  1. C/C++ 語言的字串
  2. regex 物件
  3. match_results 物件
  4. regex_match 與 regex_search 演算法
這邊需要注意的是,根據妳使用的字串類型 (C or C++ 字串) 不同,妳需要選擇的 match_results 物件也會有所不同歐。使用 C 語言字串的朋友,請選擇 cmatch。而使用 C++ 字串 (string) 的朋友,請使用 smatch。看出其中的差別了嗎?

那如果我要使用寬字元勒? 行!妳知道!我知道!獨眼龍也知道! C++ 的寬字元字串是 wstring,所以如果使用寬字元的 match_results 就是要用 wsmatch 啦!而且連 C 語言字串也有寬字元版的 match_results 歐!看到這裡妳也應該猜到是 wcmatch 了吧?



非寬字元
寬字元
C 字串

cmatch

wcmatch

C++ 字串

smatch

wsmatch

regex 物件也必須依照妳所使用的字串類型來對應,看妳是用寬字元還是非寬字元。 regex 物件就是代表我們所撰寫的正規表示法的字串。

非寬字元
寬字元
regex
wregex

搜尋的演算法有兩個,完全符合演算法 (regex_match),部份符合演算法 (regex_search)。
使用的方法如下:

regex_search(搜尋字串,match_results 物件, regex 物件,特性旗標);

regex_search(搜尋字串 (string) 迭代器1,搜尋字串迭代器2,match_results 物件,regex 物件,特性旗標);

這邊可能有個問題是,什麼是字串的迭代器?妳可以把他想成類似指標的東西即可。
搜尋字串迭代器1:指向字串的開頭
搜尋字串迭代器2:指向字串的結尾

作法如下:


string::const_iterator it = 搜尋字串.begin();
string::const_iterator end = 搜尋字串.end();

瞭解上面所的基礎知識之後,現在來試試看一個簡單的程式吧!

被搜尋的字串 raw_text = ""aaaaaaaaaa<D>123abc</D>bbbbbbbbbbbbb"";
假設我們想要利用正規表示法找出 <D></D> 裡面的字串 123abc
我們可以設定我們的正規表示法字串為 reg_str = "<D>(.*?)</D>";
然後我們再使用 regex_search 演算法來搜尋即可。

程式如下:


在使用 regex_search 搜尋之後,搜尋的結果會被存在 smatch 物件裡面,這個物件支援使用陣列的索引,而這個索引是有固定意義的。假設有個 smatch 物件 ms,則

  1. ms[0] 表示搜尋對應到的字串。就是<D>123abc</D>
  2. ms[1] 表示第一個比對到的字串。就是正規表示法裡面的 (.*?),也就是 123abc
  3. prefix() 函式表示在 ms[0] 所表示的字串之前的字串。
  4. suffix() 函式表示在 ms[0] 所表示的字串之後的字串。
好啦!說到這裡也有點口渴了,先泡杯茶吧!

留言

這個網誌中的熱門文章

XBOX 360 無線手把 控制器 簡易維修

建立 boost 的時間要好久啊!