kpcre1.c

最終更新:2009/12/30

kpcre1.c

001: /* kpcre.c 
002:  * 正規表現を用いたマッチの例 (PCRE 使用)
003:  */
004: 
005: #define USAGE "Usage kpcre <string> <pattern>\n"
006: 
007: #define OVECSIZE 99
008: 
009: #include "mystab.h"
010: #include "apr_strings.h"
011: 
012: #include "pcre.h"
013: 
014: int apr_my_main (
015:   int ac, char **av
016:   , apr_file_t * astdin
017:   , apr_file_t * astdout
018:   , apr_file_t * astderr
019:   , apr_pool_t * pool
020: ) {
021: 
022:   int error_flag = 0;
023: 
024:   if (ac < 3) {
025:     apr_file_printf(astderr, USAGE);
026:     goto _FINALLY_;
027:   }
028: 
029:   {
030:     const char *str=av[1];
031:     const char *pattern = av[2];
032:     
033:     pcre *preg = NULL;
034:     const char *err_str = NULL;
035:     int err_offset = 0;
036:     
037:     apr_file_printf(astdout, "str=[%s]\npattern=[%s]\n", str, pattern);
038:     
039:     /* 正規表現のコンパイル */
040: 
041:     preg = pcre_compile(pattern, 0, &err_str, &err_offset, NULL);
042: 
043:     if (!preg) {
044:       apr_file_printf(astderr, "ERROR: pcre_compile: %s %d ", err_str, err_offset);
045:       error_flag = 1;
046:       goto _FINALLY_;
047:     }
048: 
049:     /* 文字列のマッチング */
050:     {
051:       /* マッチ位置を格納する領域。
052:        * (全体マッチの個数1+部分マッチの個数)×3以上確保しないと
053:        * pcre_exec の返り値は 0 になる。
054:        * 例:日時文字列のマッチング
055:        * ^((\d\d\d\d)/(\d\d)/(\d\d))\s+((\d\d):(\d\d):(\d\d))
056:        * の場合、部分マッチが8個あるので、(1+8)×3=27以上。
057:        */
058:       int ovector[OVECSIZE];
059:       
060:       /* マッチング */
061:       
062:       int rc = pcre_exec(preg, NULL, str, strlen(str), 0, 0, ovector, OVECSIZE);
063:       
064:       if (rc > 0) {
065:         int i=0;
066:         
067:         /* マッチ結果の表示
068:          * 全体マッチ:
069:          * ovector[0] - 全体マッチの始まりの位置
070:          * ovector[1] - 全体マッチの終わりの位置(1バイト前までが含まれる)
071:          * 以降は部分マッチ:
072:          * ovector[i*2] - 部分マッチの始まりの位置
073:          * ovector[i*2+1] - 部分マッチの終わりの位置(1バイト前までが含まれる)
074:          */
075:         apr_file_printf(astdout, "Mached:\n");
076:         for (i=0; i<rc; i++) {
077:           int start = ovector[i*2];
078:           int end = ovector[i*2 + 1];
079:           apr_file_printf(astdout, "%d: start=%d end=%d [%s]\n", i, start, end,
080:             apr_pstrndup(pool, str+start, end-start));
081:         }
082:       } else {
083:         error_flag = 1;
084:         apr_file_printf(astdout, "Not Mached (%d)\n", rc);
085:       }
086:     }
087:     
088:     /* 正規表現の開放 */
089:     free(preg);
090:   }
091: 
092:   _FINALLY_:
093: 
094:   if (error_flag) {
095:     apr_file_printf(astderr, "\nfailed.\n");
096:     return 1; /* 異常終了 */
097:   }
098:   
099:   apr_file_printf(astdout, "\ndone.\n");
100:   return 0; /* 正常終了 */
101: }
102: 
Copyright (C) KAKU PROJECT (2009)KAKU PROJECT (2009)