FrontPage

C++と正規表現(regex++) テストその1

C/C++言語ソースファイルを想定し、正規表現を使って解析する。

C++入門/正規表現2
C++入門/正規表現3

制約

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による定数定義が、文字定数によって行われていたら?

#define CHAR_THREE '3'       // ソースとしては問題のない書き方

今はcoutで画面表示に成功しているが、UNICODE対応(wsmatch使用)にすると、コンパイルエラーとなる。
むしろ、sub_matchが文字列として表示されていることが奇跡的?


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-02-08 (月) 02:08:11 (5190d)