''[[FrontPage]]''
* C++と正規表現(regex++) テストその1 [#k9df5326]
C/C++言語ソースファイルを想定し、正規表現を使って解析する。~
[[C++入門/正規表現2]]~
[[C++入門/正規表現3]]
** 制約 [#i68b3c78]
MFC、.NET関数を使用しないこと。~
~
#include <string> //
#include <iostream> // for cout
#include <boost/regex.hpp> // for regex++
#include <tchar.h> //
// # include "x.x.h" // (空)宣言文のあらゆる可能性をテスト
//
using namespace std; // 名前空間
using namespace boost; // 名前空間
//
//
regex targetI( // 正規表現のコンパイル
"#[[:space:]]*(include)" // "#"と空白を挟んだ"include"
"[[:space:]]*L*\"" // 0以上の空白文字に続く'"'
"(.*?" // ファイル名を最短マッチ
"\.[hc]p{0,2})" // 想定される拡張子
"\"" ); // ダブルクォーテーション右
//
char main( void ) // 正規表現のテスト
{ //
const string file( // ソースファイルの内容を仮定
"#include <windows.h> \n" //
"#include \"me.h.h\" \n" //
"#include \"stuff.cpp\""); //
//
string::const_iterator start; // イテレータの宣言
string::const_iterator end; // イテレータの宣言
//
start = file.begin(); // 開始イテレータの設定
end = file.end(); // 末尾イテレータの設定
//
smatch partial; // マッチ情報を格納する
match_flag_type flags = match_default; // flagの初期設定
//
while(regex_search(start, end, partial, targetI, flags)) // ループ
{ // マッチが見つかった場合
cout << // 画面表示
"partial[0] = " << partial[0] << // 部分文字列[0](全体)
"\npartial[1] = " << partial[1] << // 部分文字列[1]
"\npartial[2] = " << partial[2] << // 部分文字列[2]
"\npartial[3] = " << partial[3] << // 部分文字列[3]
"\npartial[4] = " << partial[4] << // 部分文字列[4]
'\n' <<endl; //
//
start = partial[0].second; // 開始イテレータの更新(次のマッチを探す)
//
flags |= match_prev_avail; // flagの更新
flags |= match_not_bob; //
} //
//
getchar(); // 表示結果確認用
return 0; //
}
*** 修正履歴 [#ae17ed05]
boost、regexライブラリのビルドに成功。~
*** 課題 [#h8bd802d]
インクルードファイル名が"xxxx.h.h"のように、複数のピリオドを含んでいたら?(打開)~
defineによる定数定義が、文字定数によって行われていたら?
#define CHAR_THREE '3' // ソースとしては問題のない書き方
今はcoutで画面表示に成功しているが、UNICODE対応(wsmatch使用)にすると、コンパイルエラーとなる。~
むしろ、sub_matchが文字列として表示されていることが奇跡的?