妳也懂 REGEX ?
來到這裡的朋友們,想必也知道 REGEX 是什麼了吧!今天我們要豪洨說明的就是 BOOST 函式庫裡面的 REGEX 函式庫啊!當然,這玩意個函式庫不是三言兩語就能說得完,所以先從最簡單的部份開始摟。
要撰寫使用 REGEX 函式庫的程式,我們需要的材料有:
首先,我們需要將 REGEX 函式庫連結以及在我們的程式裡面引入 "boost/regex.hpp" ,接下來就可以開始撰寫程式。
要使用 REGEX 來搜尋字串,其實也不外乎幾個東西:
那如果我要使用寬字元勒? 行!妳知道!我知道!獨眼龍也知道! C++ 的寬字元字串是 wstring,所以如果使用寬字元的 match_results 就是要用 wsmatch 啦!而且連 C 語言字串也有寬字元版的 match_results 歐!看到這裡妳也應該猜到是 wcmatch 了吧?
regex 物件也必須依照妳所使用的字串類型來對應,看妳是用寬字元還是非寬字元。 regex 物件就是代表我們所撰寫的正規表示法的字串。
搜尋的演算法有兩個,完全符合演算法 (regex_match),部份符合演算法 (regex_search)。
使用的方法如下:
這邊可能有個問題是,什麼是字串的迭代器?妳可以把他想成類似指標的東西即可。
搜尋字串迭代器1:指向字串的開頭
搜尋字串迭代器2:指向字串的結尾
作法如下:
瞭解上面所的基礎知識之後,現在來試試看一個簡單的程式吧!
被搜尋的字串 raw_text = ""aaaaaaaaaa<D>123abc</D>bbbbbbbbbbbbb"";
假設我們想要利用正規表示法找出 <D></D> 裡面的字串 123abc
我們可以設定我們的正規表示法字串為 reg_str = "<D>(.*?)</D>";
然後我們再使用 regex_search 演算法來搜尋即可。
程式如下:
在使用 regex_search 搜尋之後,搜尋的結果會被存在 smatch 物件裡面,這個物件支援使用陣列的索引,而這個索引是有固定意義的。假設有個 smatch 物件 ms,則
要撰寫使用 REGEX 函式庫的程式,我們需要的材料有:
- 已經編譯好的函式庫檔案
- 標頭檔
首先,我們需要將 REGEX 函式庫連結以及在我們的程式裡面引入 "boost/regex.hpp" ,接下來就可以開始撰寫程式。
要使用 REGEX 來搜尋字串,其實也不外乎幾個東西:
- 要被搜尋的字串
- 正規表示法
- 搜尋的結果
- 搜尋的演算法 (完全符合,部份符合)
- C/C++ 語言的字串
- regex 物件
- match_results 物件
- regex_match 與 regex_search 演算法
那如果我要使用寬字元勒? 行!妳知道!我知道!獨眼龍也知道! 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,則
- ms[0] 表示搜尋對應到的字串。就是<D>123abc</D>
- ms[1] 表示第一個比對到的字串。就是正規表示法裡面的 (.*?),也就是 123abc
- prefix() 函式表示在 ms[0] 所表示的字串之前的字串。
- suffix() 函式表示在 ms[0] 所表示的字串之後的字串。
留言
張貼留言