「C」GNU C Library ( regex.h ) を使った正規表現のサンプル
なんとなく正規表現サンプルを書いてみました。
先に実際のコードを。
■ 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
以上になります。