Boost.Regexを使ってみる(1)
今回はMinGW環境下でBoost.Regexを使ってみます。 Boost.Regexはテンプレートだけではなく、ライブラリを必要としますのでリンクでregexのライブラリをリンクする必要があります。
コンパイルとリンク
ヘッダファイルのインクルード
Boost.Regex を利用する場合は、boost/regex.hpp をインクルードする必要があります。
ソースに以下のように記述します。
#include <boost/regex.hpp>
インクルードパスの設定
コンパイルする際、インクルードパスを設定します。
「Boostのインストール」で説明した方法でインストールした場合、 インストール先のフォルダ下のinclude\boost-1_33_1\boost の下にヘッダファイルが生成されています。
Boostのヘッダファイルの #include の記述は #include <boost/xxxxx.hpp> となっていますので、 インクルードパスの指定は <インストール先のフォルダ>\boost-1_33_1 となります。
例えば C:\Boost にインストールした場合は、以下のようにコンパイル時に指定します。
-Ic:/Boost/boost-1_33_1
regexライブラリのリンク
次にライブラリをリンクするように指定します。
インストール先のフォルダ下の lib の下に各ライブラリが作成されています。
*regex*の名前のものがregexのライブラリです。DLLも生成されていますが、今回は静的ライブラリを利用します。
libboost_regex-mgw.lib が静的ライブラリになりますので、本ライブラリを静的リンクします。
以下に、Makefileの例を記述します。
CXX = g++ CXXFLAGS = -g LDFLAGS = INCLUDES = -I. -Ic:/Boost/boost-1_33_1 LIBS = c:/Boost/lib/libboost_regex-mgw.lib TARGET = sample1.exe SRCS = sample1.cpp OBJS = $(SRCS:.cpp=.o) all: $(TARGET) clean: -rm $(TARGET) $(OBJS) $(TARGET): $(OBJS) $(CXX) $(LDFLAGS) -o $@ $(OBJS) $(LIBS) .cpp.o: $(CXX) $(CXXFLAGS) $(INCLUDES) -c $< -o $@
次は、実際にregexのクラスを利用した例を説明します。
正規表現の利用
regex_match
regex_match は入力テキストが正規表現と完全に一致、またはオプションにより途中まで一致した場合に、 結果が真になります。
基本的な使用例を記述します。
以下のコードは、文字列 "Free Programming For Windows." に対して、正規表現 "Free.+Windows\." が完全一致するか検査しています。
\は""内でエスケープ文字となりますので\\と記述します。
string str("Free Programming For Windows."); boost::regex reg("Free.+Windows\\."); if (boost::regex_match(str, reg)) { cout << "===> Matched." << endl; } else { cout << "===> Not matched." << endl; }
結果は真となり、以下のように表示されるはずです。
===> Matched.
次に、以下のコードではどうでしょうか?
string str("Free Programming For Windows."); boost::regex reg("Free.+Windows"); if (boost::regex_match(str, reg)) { cout << "===> Matched." << endl; } else { cout << "===> Not matched." << endl; }
正規表現に先後の.の一致がありませんので、結果は偽となり、以下のように表示されるはずです。
===> Not matched.
このように、regex_match は正規表現と完全に一致した場合に真となります。
では、正規表現はそのままに以下のように regex_constants::match_partial を指定してみます。
string str("Free Programming For Windows."); boost::regex reg("Free.+Windows"); if (boost::regex_match(str, reg, boost::regex_constants::match_partial)) { cout << "===> Matched." << endl; } else { cout << "===> Not matched." << endl; }
regex_constants::match_partial を指定すると、途中まで一致した結果は真となり、 以下のようになります。
===> Matched.
次に match_results を利用して、マッチした値を取得します。
string str("Free Programming For Windows."); boost::regex reg("Free (\\w+) (\\w+) Windows\\."); boost::smatch result; if (boost::regex_match(str1, result, reg1c)) { cout << "===> Matched." << endl; cout << "size():" << result.size() << endl; cout << "result.str(0):" << result.str(0) << endl; cout << "result.str(1):" << result.str(1) << endl; cout << "result.str(2):" << result.str(2) << endl; } else { cout << "===> Not matched." << endl; }
match_resultsは正規表現でマッチした結果の集合を示します。 0番目の要素はマッチした全体を示し、1番目は最初の()で囲まれたグループを示し、 2番目は次の()で囲まれたグループを示します。
結果は以下のようになります。
===> Matched. size():3 result.str(0):Free Programming For Windows. result.str(1):Programming result.str(2):For
次の Boost.Regexを使ってみる(2) ではregex_searchを使用します。