Boost.Regexを使ってみる(1)
今回はMinGW環境下でBoost.Regexを使ってみます。 Boost.Regexはテンプレートだけではなく、ライブラリを必要としますのでリンクでregexのライブラリをリンクする必要があります。
正規表現の利用
regex_search
regex_search は入力テキストに正規表現に一致するものが含まれている場合に、結果が真になります。 また、regex_matchとは異なり全ての一致を探します。
基本的な使用例を記述します。
以下のコードは、文字列 "Free <em>Programming</em> For Windows." に対して、正規表現 "<[^>]+>" が一致するか検査しています。
string str("Free <em>Programming</em> For Windows."); boost::regex reg("<[^>]+>"); if (boost::regex_search(str, reg)) { cout << "===> Matched." << endl; } else { cout << "===> Not matched." << endl; }
結果は真となり、以下のように表示されるはずです。
===> Matched.
次の例は、一致した文字をすべて取得し表示します。
string str("Free <em>Programming</em> For Windows."); boost::regex reg("<[^>]+>"); string::const_iterator start=str.begin(); string::const_iterator end=str.end(); boost::smatch result; while (regex_search(start, end, result, reg)) { cout << result.str(0) << endl; start = result[0].second; }
結果は以下のように表示されます。
<em> </em>
以下は同時に()でグルーピングした値を取得しています。
string str("Free <em>Programming</em> For Windows."); boost::regex reg("<([^>]+)>"); string::const_iterator start=str.begin(); string::const_iterator end=str.end(); boost::smatch result; while (regex_search(start, end, result, reg)) { cout << result.str(0) << endl; cout << result.str(1) << endl; start = result[0].second; }
結果は以下のように表示されます。
<em> em </em> /em
regex_replace
regex_replace は正規表現に一致するものを置換します。
基本的な使用例を記述します。
以下のコードは、文字列 "Free Programming For Windows." に対して、正規表現 "P\w+" に一致するものを"Software"に置換します。
string str("Free Programming For Windows."); boost::regex reg("P\\w+"); string str2 = regex_replace(str, reg, "Software"); cout << str2 << endl;
結果は、以下のように表示されます。
Free Software For Windows.
置換文字列には$0等でマッチした値を使用することができます。
string str("Free Programming For Windows."); boost::regex reg("P\\w+"); string str2 = regex_replace(str, reg, "<em>$0</em>"); cout << str2 << endl;
結果は、以下のように表示されます。
Free <em>Programming</em> For Windows.