C++と正規表現(regex++) テストその1 †C/C++言語ソースファイルを想定し、正規表現を使って解析する。 制約 †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; // } 修正履歴 †boost、regexライブラリのビルドに成功。 課題 †インクルードファイル名が"xxxx.h.h"のように、複数のピリオドを含んでいたら?(打開) #define CHAR_THREE '3' // ソースとしては問題のない書き方 今はcoutで画面表示に成功しているが、UNICODE対応(wsmatch使用)にすると、コンパイルエラーとなる。 |