フリープログラミング for windows.

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を使用します。

 

1. Boostのインストール
2. Boost.Regexを使ってみる(1)
3. Boost.Regexを使ってみる(2)

ソフトウエア製品

やっぱり、製品版でないとなにかと不自由な面も多いのは確かです。Windowsプログラミングするなら...

■ Visual Studio 2008

検出率、アップデート頻度、軽さ等、好評のセキュリティソフト...

■ カスペルスキー

格安レンタルサーバ

月額1000円以下で利用できるレンタルサーバです。

■ ロリポップ!
■ チカッパ!
■ さくらインターネット
■ TOK2 PROFESSIONAL
■ Bfit.jp

ネットバンク

金利の高さと、手数料の安さからネットバンクはたいへんお得です。

■ ジャパンネット銀行
■ イーバンク銀行

アフィリエイト

ブログ、ホームページを持っているなら、アフィリエイトで広告収入を得られます。

■ A8.net
■ リンクシェア
■ JANet

パソコン・周辺機器

インターネットだけのサービスやアウトレット、思わぬ掘り出し物があるので、こまめにチェックしたいものです。

メーカ直販系
□ パソコン本体
■ デルオンラインストア
■ エプソンダイレクト
■ ソニースタイル
■ Apple Store
■ 富士通直販サイト WEB MART
■ NEC「得選街」
■ レノボ・ジャパン株式会社
■ マウスコンピューター
□ 周辺機器
■ ioPLAZA
ショップ系
■ ジョーシン
■ パソコン専門店PCDEPOT WEB本店


Apple Store(Japan)
Copyright(C) 2005 freepg-lab. All rights reserved.
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送