''[[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が文字列として表示されていることが奇跡的?

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS