C++入門/正規表現3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
''[[FrontPage]]''
* C++と正規表現(regex++) テストその3(最終) [#u0885174]
C/C++言語ソースファイルを想定し、正規表現を使って解析する...
~
&color(#FF0000,){とりあえずC++正規表現シリーズはこれで凍...
&color(#FF0000,){ここまでできれば、あとは自分で検索対象を...
[[C++入門/正規表現1]]~
[[C++入門/正規表現2]]
** 制約 [#bc40674b]
MFC、.NET関数を使用しないこと。~
~
#include <string> ...
#include <iostream> ...
#include <sstream> ...
#include <boost/regex.hpp> ...
#include <tchar.h> ...
// # include "x.x.txt" ...
#define MODE_ONE 1 ...
#define MODE_TWO 2 ...
#define MODE_THREE 3 ...
#define MODE_FOUR 4 ...
#define MODE_FIVE 5 ...
//# define s_s_s s _T("// comment") ...
...
using namespace std; ...
using namespace boost; ...
...
#ifdef UNICODE ...
typedef wregex tregex; ...
typedef wstring tstring; ...
typedef wsmatch tsmatch; ...
//typedef wstringstream tstringstream; ...
//typedef wprintf tprintf; ...
#else ...
typedef regex tregex; ...
typedef string tstring; ...
typedef smatch tsmatch; ...
//typedef stringstream tstringstream; ...
//typedef wprintf tprintf; ...
#endif ...
...
typedef unsigned char u1b; ...
typedef signed char s1b; ...
...
s1b analizer( tstring de_file, u1b mode ); ...
s1b styleRemove( tstring* de_file ); ...
...
s1b main( void ) ...
{ ...
const tstring file( ...
_T("#include <windows.h> // インクルード宣言\...
_T("#include \"me.h.h\" \n") ...
_T("#include \"stuff.h\" \n") ...
_T("#include \"a.hpp.cpp\" // #include \"a...
_T("/* #include \"mantarou.h\" うまく\n") ...
_T("いくかな?\n*/") ...
_T("// #include \"b.h\"\n") ); ...
...
styleRemove( (tstring*)&file ); ...
analizer( file, MODE_ONE ); ...
...
getchar(); ...
return 0; ...
}
s1b analizer( ...
tstring de_file, ...
u1b mode ) ...
{ ...
try ...
{ ...
tregex target; ...
...
switch( mode ) ...
{ ...
case MODE_ONE: ...
target = ...
// _T("\n[[:blank:]]*") ...
_T("#[[:blank:]]*(include)") ...
_T("[[:blank:]]*L?\"") ...
_T("(.*?)") ...
// _T("\\.[hc]p{0,2})") ...
_T("\"" ); ...
break; ...
...
case MODE_TWO: ...
break; ...
...
case MODE_THREE: ...
break; ...
...
case MODE_FOUR: ...
break; ...
...
case MODE_FIVE: ...
break; ...
...
default: ...
break; ...
} ...
...
tstring::const_iterator start; ...
tstring::const_iterator end; ...
...
start = de_file.begin(); ...
end = de_file.end(); ...
...
tsmatch partial; ...
match_flag_type flags = match_default; ...
...
while(regex_search(start, end, partial, target, ...
{ ...
printf( "partial[0] = %s\n", ...
string( partial[0].first, partial[0].sec...
wprintf( L"partial[1] = %s\n", ...
wstring( partial[1].first, partial[1].se...
wprintf( L"partial[2] = %s\n", ...
wstring( partial[2].first, partial[2].se...
wprintf( L"partial[3] = %s\n", ...
wstring( partial[3].first, partial[3].se...
wprintf( L"partial[4] = %s\n\n", ...
wstring( partial[4].first, partial[4].se...
...
start = partial[0].second; ...
...
flags |= match_prev_avail; ...
flags |= match_not_bob; ...
} ...
} ...
catch( const exception& e ) ...
{ ...
printf("解析エラー\n"); ...
return -1; ...
} ...
...
return 0; ...
}
s1b styleRemove( ...
tstring* de_file ) ...
{ ...
try ...
{ ...
printf("コメント削除前のサイズ = %d\n", de_file-...
...
tregex block( ...
_T("/\\*") ...
_T(".*?") ...
_T("\\*/") ); ...
...
tregex line( ...
_T("[[:blank:]]*") ...
_T("//.*?\n") ); ...
...
*de_file = regex_replace( ...
*de_file, block, _T(""), match_default ); ...
...
*de_file = regex_replace( ...
*de_file, line, _T(""), match_default ); ...
...
printf("コメント削除後のサイズ = %d\n\n", de_fil...
} ...
catch( const exception& e ) ...
{ ...
printf("コメント削除エラー\n"); ...
return -1; ...
} ...
...
return 0; ...
}
表示結果
コメント削除前のサイズ = 197
コメント削除後のサイズ = 88
partial[0] = #include "me.h.h"
partial[1] = inlude
partial[2] = me.h.h
partial[3] =
partial[4] =
partial[0] = #include "stuff.h"
partial[1] = inlude
partial[2] = stuff.h
partial[3] =
partial[4] =
partial[0] = #include "a.hpp.cpp"
partial[1] = inlude
partial[2] = a.hpp.cpp
partial[3] =
partial[4] =
*** 修正履歴 (その2からの分も含む) [#u5fb6e49]
boost、regexライブラリのビルドに成功。~
Unicodeへの対応は強引だが可能?(なにがおもしろいのかがい...
*** 課題 [#a8b2c7cf]
インクルードファイル名が"xxxx.h.h"のように、複数のピリオ...
defineによる定数定義が、文字定数や文字列によって行われて...
#define CHAR_THREE '3' // 文字定数なら打開可能
#define COMMENT "// comment" // コメント削除対象になって...
→ ここまではさすがに対応しなくても良さそうな気がする。~
~
今はcoutで画面表示に成功しているが、UNICODE対応(wsmatch使...
むしろ、sub_matchが文字列として表示されていることが奇跡的...
string( partial[0].first, partial[0].second).c_str() ) ...
終了行:
''[[FrontPage]]''
* C++と正規表現(regex++) テストその3(最終) [#u0885174]
C/C++言語ソースファイルを想定し、正規表現を使って解析する...
~
&color(#FF0000,){とりあえずC++正規表現シリーズはこれで凍...
&color(#FF0000,){ここまでできれば、あとは自分で検索対象を...
[[C++入門/正規表現1]]~
[[C++入門/正規表現2]]
** 制約 [#bc40674b]
MFC、.NET関数を使用しないこと。~
~
#include <string> ...
#include <iostream> ...
#include <sstream> ...
#include <boost/regex.hpp> ...
#include <tchar.h> ...
// # include "x.x.txt" ...
#define MODE_ONE 1 ...
#define MODE_TWO 2 ...
#define MODE_THREE 3 ...
#define MODE_FOUR 4 ...
#define MODE_FIVE 5 ...
//# define s_s_s s _T("// comment") ...
...
using namespace std; ...
using namespace boost; ...
...
#ifdef UNICODE ...
typedef wregex tregex; ...
typedef wstring tstring; ...
typedef wsmatch tsmatch; ...
//typedef wstringstream tstringstream; ...
//typedef wprintf tprintf; ...
#else ...
typedef regex tregex; ...
typedef string tstring; ...
typedef smatch tsmatch; ...
//typedef stringstream tstringstream; ...
//typedef wprintf tprintf; ...
#endif ...
...
typedef unsigned char u1b; ...
typedef signed char s1b; ...
...
s1b analizer( tstring de_file, u1b mode ); ...
s1b styleRemove( tstring* de_file ); ...
...
s1b main( void ) ...
{ ...
const tstring file( ...
_T("#include <windows.h> // インクルード宣言\...
_T("#include \"me.h.h\" \n") ...
_T("#include \"stuff.h\" \n") ...
_T("#include \"a.hpp.cpp\" // #include \"a...
_T("/* #include \"mantarou.h\" うまく\n") ...
_T("いくかな?\n*/") ...
_T("// #include \"b.h\"\n") ); ...
...
styleRemove( (tstring*)&file ); ...
analizer( file, MODE_ONE ); ...
...
getchar(); ...
return 0; ...
}
s1b analizer( ...
tstring de_file, ...
u1b mode ) ...
{ ...
try ...
{ ...
tregex target; ...
...
switch( mode ) ...
{ ...
case MODE_ONE: ...
target = ...
// _T("\n[[:blank:]]*") ...
_T("#[[:blank:]]*(include)") ...
_T("[[:blank:]]*L?\"") ...
_T("(.*?)") ...
// _T("\\.[hc]p{0,2})") ...
_T("\"" ); ...
break; ...
...
case MODE_TWO: ...
break; ...
...
case MODE_THREE: ...
break; ...
...
case MODE_FOUR: ...
break; ...
...
case MODE_FIVE: ...
break; ...
...
default: ...
break; ...
} ...
...
tstring::const_iterator start; ...
tstring::const_iterator end; ...
...
start = de_file.begin(); ...
end = de_file.end(); ...
...
tsmatch partial; ...
match_flag_type flags = match_default; ...
...
while(regex_search(start, end, partial, target, ...
{ ...
printf( "partial[0] = %s\n", ...
string( partial[0].first, partial[0].sec...
wprintf( L"partial[1] = %s\n", ...
wstring( partial[1].first, partial[1].se...
wprintf( L"partial[2] = %s\n", ...
wstring( partial[2].first, partial[2].se...
wprintf( L"partial[3] = %s\n", ...
wstring( partial[3].first, partial[3].se...
wprintf( L"partial[4] = %s\n\n", ...
wstring( partial[4].first, partial[4].se...
...
start = partial[0].second; ...
...
flags |= match_prev_avail; ...
flags |= match_not_bob; ...
} ...
} ...
catch( const exception& e ) ...
{ ...
printf("解析エラー\n"); ...
return -1; ...
} ...
...
return 0; ...
}
s1b styleRemove( ...
tstring* de_file ) ...
{ ...
try ...
{ ...
printf("コメント削除前のサイズ = %d\n", de_file-...
...
tregex block( ...
_T("/\\*") ...
_T(".*?") ...
_T("\\*/") ); ...
...
tregex line( ...
_T("[[:blank:]]*") ...
_T("//.*?\n") ); ...
...
*de_file = regex_replace( ...
*de_file, block, _T(""), match_default ); ...
...
*de_file = regex_replace( ...
*de_file, line, _T(""), match_default ); ...
...
printf("コメント削除後のサイズ = %d\n\n", de_fil...
} ...
catch( const exception& e ) ...
{ ...
printf("コメント削除エラー\n"); ...
return -1; ...
} ...
...
return 0; ...
}
表示結果
コメント削除前のサイズ = 197
コメント削除後のサイズ = 88
partial[0] = #include "me.h.h"
partial[1] = inlude
partial[2] = me.h.h
partial[3] =
partial[4] =
partial[0] = #include "stuff.h"
partial[1] = inlude
partial[2] = stuff.h
partial[3] =
partial[4] =
partial[0] = #include "a.hpp.cpp"
partial[1] = inlude
partial[2] = a.hpp.cpp
partial[3] =
partial[4] =
*** 修正履歴 (その2からの分も含む) [#u5fb6e49]
boost、regexライブラリのビルドに成功。~
Unicodeへの対応は強引だが可能?(なにがおもしろいのかがい...
*** 課題 [#a8b2c7cf]
インクルードファイル名が"xxxx.h.h"のように、複数のピリオ...
defineによる定数定義が、文字定数や文字列によって行われて...
#define CHAR_THREE '3' // 文字定数なら打開可能
#define COMMENT "// comment" // コメント削除対象になって...
→ ここまではさすがに対応しなくても良さそうな気がする。~
~
今はcoutで画面表示に成功しているが、UNICODE対応(wsmatch使...
むしろ、sub_matchが文字列として表示されていることが奇跡的...
string( partial[0].first, partial[0].second).c_str() ) ...
ページ名: