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.