正規表現-照合:regex_match
対象となる文字列が正規表現と一致するかを調べます。
#include <iostream> #include <string> #include <boost/tr1/regex.hpp> using namespace std; int main() { // sourceがreにマッチするかを調べる。結果はresultsに。 string source = "<a HREF='http://blogs.wankuma.com.episteme/'>"; tr1::regex re("<[aA] +(href|HREF)=['\"](.*:)(.*)['\"].*>"); tr1::smatch results; if ( tr1::regex_match(source, results, re) ) { // 部分マッチの詳細を出力する for ( size_t i = 0; i < results.size(); ++i ) { cout << i << ':' << results.position(i) << ',' << results.length(i) << ':' << results.str(i) << endl; } } }
0:0,45:<a HREF='http://blogs.wankuma.com.episteme/'> 1:3,4:HREF 2:9,5:http: 3:14,29://blogs.wankuma.com.episteme/
regex_matchには文字列(string)、正規表現(regex)そして結果を格納するsmatchを与えます。文字列が正規表現に完全マッチすればtrueを返します。戻り値がtrueのとき、smatchにマッチした文字列の詳細が格納されています。
第n番目の部分マッチすなわち正規表現中N番目に現れる開きカッコ'('とそれに対応する閉じカッコ')'で囲まれた部分について、position(n)、 length(n)、 str(n) がそれぞれ先頭からの位置、長さ、文字列を返します(n=0は正規表現全体を表します)。
#include <iostream> #include <string> #include <locale> #include <boost/tr1/regex.hpp> using namespace std; int main() { wcout.imbue(locale("japanese")); wstring source = L"平成十九年十二月"; tr1::wregex re(L"(平成|昭和|大正)(..?)年(..?)月"); tr1::wsmatch results; if ( tr1::regex_match(source, results, re) ) { for ( size_t i = 0; i < results.size(); ++i ) { wcout << i << L':' << results.position(i) << L',' << results.length(i) << L':' << results.str(i) << endl; } } }
0:0,8:平成十九年十二月 1:0,2:平成 2:2,2:十九 3:5,2:十二
