読者です 読者をやめる 読者になる 読者になる

「C」GNU C Library ( regex.h ) を使った正規表現のサンプル

C

なんとなく正規表現サンプルを書いてみました。

先に実際のコードを。

■ regextest1.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <regex.h>

int main(int argc, char *argv[])
{
  regex_t preq;
  int errcode, i;
  char regex[] = "^a.*b$";

  errcode = regcomp(&preq, regex, REG_EXTENDED | REG_NOSUB);
  if(errcode !=0) {
    char buf[1024];
    regerror(errcode, &preq, buf, sizeof(buf));
    exit(1);
  }

  for(i = 1; i < argc; i++) {
    if(regexec(&preq, argv[i], 0, NULL, 0) ==0) {
      printf("%s : pattern match !\n", argv[i]);
    } else {
      printf("%s : pattern not match !\n", argv[i]);
    }
  }

  regfree(&preq);
  exit(0);
}


■ regextest2.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <regex.h>

int main(int argc, char *argv[])
{
  regex_t preq;
  int errcode, i, j;
  char regex[] = "^(a.*b)(c.*d)$";
  size_t nmatch = 3;
  regmatch_t pmatch[3];

  errcode = regcomp(&preq, regex, REG_EXTENDED);
  if(errcode !=0) {
    char buf[1024];
    regerror(errcode, &preq, buf, sizeof(buf));
    exit(1);
  }

  for(i = 1; i < argc; i++) {
    if(regexec(&preq, argv[i], 3, pmatch, 0) ==0) {
      printf("%s : pattern match !\n", argv[i]);

      printf("group 0 : ");
      for(j = pmatch[0].rm_so; j < pmatch[0].rm_eo; j++) {
        printf("%c", argv[i][j]);
      }
      printf("\n");

      printf("group 1 : ");
      for(j = pmatch[1].rm_so; j < pmatch[1].rm_eo; j++) {
        printf("%c", argv[i][j]);
      }
      printf("\n");

      printf("group 2 : ");
      for(j = pmatch[2].rm_so; j < pmatch[2].rm_eo; j++) {
        printf("%c", argv[i][j]);
      }
      printf("\n");

    } else {
      printf("%s : pattern not match !\n", argv[i]);
    }
  }

  regfree(&preq);
  exit(0);
}


regextest1.c は単純にコマンドライン引数に指定された文字列が ^a.*b$ にマッチするか否かのみを確認しています。

regextest2.cコマンドライン引数に指定された文字列が ^(a.*b)(c.*d)$ にマッチするか否かを確認してますが、グループ化を使っていてマッチした場合は pmatch に各グループの開始 / 終了オフセットが入るので ( pmatch[0] は正規表現でマッチした全体を表します )、それをもとにグループ単位での出力も行なってみました。


regex の man ページは以下あたりにあります。

・Man page of REGEX
http://linuxjm.osdn.jp/html/LDP_man-pages/man3/regex.3.html

読んでないですが・・・一応本家のドキュメントも。

・The GNU C Library: Regular Expressions
http://www.gnu.org/software/libc/manual/html_node/Regular-Expressions.html


以上になります。

[ 環境情報 ]
CentOS 6.2
GCC 4.4.7