C言語で正規表現を使う時に必要なことをまとめました。
結果の数は、全体のマッチ+グルーピングの数を指定することに注意。ここでは3つ。
実行結果
regex.hをインポートする
1 |
regcomp関数で正規表現をコンパイルする
1 2 3 | regex_t regexBuffer; // コンパイル後の正規表現を格納する型 regcomp( ®exBuffer, re, REG_EXTENDED | REG_NEWLINE ); // コンパイルする |
regexec関数で実行する
regexec関数の引数は順に、- コンパイル済の正規表現
- 対象の文字列
- 結果の数
- 結果を格納する構造体regex_tの配列
- オプション
結果の数は、全体のマッチ+グルーピングの数を指定することに注意。ここでは3つ。
1 2 3 | regmatch_t patternMatch[3]; // 結果を格納する regexec( ®exBuffer, target, 3, patternMatch, 0 ); // 実行する |
結果の処理
各結果は、regmatch_tに格納される。ターゲット文字列の中でマッチした文字列の最初のインデックスrm_soと最後のインデックrm_eoを格納している。なのでその部分の文字列は、次のように自分で抽出するなりしなければならない。1 2 3 4 5 6 | auto start = patternMatch[i].rm_so; auto end = patternMatch[i].rm_eo; auto len = end - start; cout << string(target, start, len) << endl; } |
/home/hoge/work/project/trunk/hoge.log
/home/hoge/work/project/trunk
hoge.log
/home/hoge/work/project/trunk
hoge.log
regfreeで解放
使い終わったらメモリの解放をする。1 |
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #include <regex.h> int main() { using namespace std; const char *target = "/home/hoge/work/project/trunk/hoge.log"; const char *re = "(.*)/(.*\\.log)"; regex_t regexBuffer; if( regcomp( ®exBuffer, re, REG_EXTENDED | REG_NEWLINE ) != 0 ) { cerr << "regex compile failed" << endl; return 1; } regmatch_t patternMatch[3]; if( regexec( ®exBuffer, target, 3, patternMatch, 0 ) == 0 ) { for( auto i=0; i<3; i++ ) { auto start = patternMatch[i].rm_so; auto end = patternMatch[i].rm_eo; auto len = end - start; cout << string(target, start, len) << endl; } } regfree( ®exBuffer ); return 0; } |
0 件のコメント:
コメントを投稿