2013年12月4日水曜日

C言語で正規表現を使ってみた

C言語で正規表現を使う時に必要なことをまとめました。

regex.hをインポートする

#include <regex.h>

regcomp関数で正規表現をコンパイルする

  const char *re = "(.*)/(.*\\.log)"// 正規表現
  regex_t regexBuffer; // コンパイル後の正規表現を格納する型
  regcomp( &regexBuffer, re, REG_EXTENDED | REG_NEWLINE )// コンパイルする

regexec関数で実行する

regexec関数の引数は順に、
  1. コンパイル済の正規表現
  2. 対象の文字列
  3. 結果の数
  4. 結果を格納する構造体regex_tの配列
  5. オプション
を取る。
結果の数は、全体のマッチ+グルーピングの数を指定することに注意。ここでは3つ。
  const char *target = "/home/hoge/work/project/trunk/hoge.log";
  regmatch_t patternMatch[3]// 結果を格納する
  regexec( &regexBuffer, target, 3, patternMatch, 0 )// 実行する

結果の処理

各結果は、regmatch_tに格納される。ターゲット文字列の中でマッチした文字列の最初のインデックスrm_soと最後のインデックrm_eoを格納している。なのでその部分の文字列は、次のように自分で抽出するなりしなければならない。
    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;
    }
実行結果
/home/hoge/work/project/trunk/hoge.log
/home/hoge/work/project/trunk
hoge.log

regfreeで解放

使い終わったらメモリの解放をする。
regfree( &regexBuffer );

ソースコード

10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
#include <iostream>
#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( &regexBuffer, re, REG_EXTENDED | REG_NEWLINE ) != 0 ) {
    cerr << "regex compile failed" << endl;
    return 1;
  }

  regmatch_t patternMatch[3];

  if( regexec( &regexBuffer, 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( &regexBuffer );
  return 0;
}

0 件のコメント:

コメントを投稿