/* kpcre.c * 正規表現を用いたマッチの例 (PCRE 使用) */ #define USAGE "Usage kpcre \n" #define OVECSIZE 99 #include "mystab.h" #include "apr_strings.h" #include "pcre.h" int apr_my_main ( int ac, char **av , apr_file_t * astdin , apr_file_t * astdout , apr_file_t * astderr , apr_pool_t * pool ) { int error_flag = 0; if (ac < 3) { apr_file_printf(astderr, USAGE); goto _FINALLY_; } { const char *str=av[1]; const char *pattern = av[2]; pcre *preg = NULL; const char *err_str = NULL; int err_offset = 0; apr_file_printf(astdout, "str=[%s]\npattern=[%s]\n", str, pattern); /* 正規表現のコンパイル */ preg = pcre_compile(pattern, 0, &err_str, &err_offset, NULL); if (!preg) { apr_file_printf(astderr, "ERROR: pcre_compile: %s %d ", err_str, err_offset); error_flag = 1; goto _FINALLY_; } /* 文字列のマッチング */ { /* マッチ位置を格納する領域。 * (全体マッチの個数1+部分マッチの個数)×3以上確保しないと * pcre_exec の返り値は 0 になる。 * 例:日時文字列のマッチング * ^((\d\d\d\d)/(\d\d)/(\d\d))\s+((\d\d):(\d\d):(\d\d)) * の場合、部分マッチが8個あるので、(1+8)×3=27以上。 */ int ovector[OVECSIZE]; /* マッチング */ int rc = pcre_exec(preg, NULL, str, strlen(str), 0, 0, ovector, OVECSIZE); if (rc > 0) { int i=0; /* マッチ結果の表示 * 全体マッチ: * ovector[0] - 全体マッチの始まりの位置 * ovector[1] - 全体マッチの終わりの位置(1バイト前までが含まれる) * 以降は部分マッチ: * ovector[i*2] - 部分マッチの始まりの位置 * ovector[i*2+1] - 部分マッチの終わりの位置(1バイト前までが含まれる) */ apr_file_printf(astdout, "Mached:\n"); for (i=0; i