3
#include <stdio.h>
#include <string.h>
#include <pcre.h>
#define OVECCOUNT 30
#define SRCBUFFER 1024*1024

int main(int argc, char **argv){
pcre *re;
const char *error;
int erroffset;
int ovector[OVECCOUNT];
int rc, i;
if (argc != 2){
    fprintf(stderr, "Usage : %s PATTERN\n", argv[0]);
    return 1;
}

char *src=malloc(SRCBUFFER);
int srclen = fread(src, sizeof(char), SRCBUFFER, stdin);
re = pcre_compile(argv[1], 0, &error, &erroffset, NULL);
if (re == NULL){
    fprintf(stderr, "PCRE compilation failed at offset %d: %s\n", erroffset, error);
    return 1;
}

rc = pcre_exec(re, NULL, src, srclen, 0, 0, ovector, OVECCOUNT);
if (rc < 0){
    if (rc == PCRE_ERROR_NOMATCH) fprintf(stderr, "Sorry, no match...\n");
    else fprintf(stderr, "Matching error %d\n", rc);
    return 1;
}

for (i = 0; i < rc; i++){
    char *substring_start = src + ovector[2 * i];
    int substring_length = ovector[2 * i + 1] - ovector[2 * i];
    fprintf(stdout, "%2d: %.*s\n", i, substring_length, substring_start);
}
return 0;
}

それを実行します

エコー「アップルバナナアフリカ」| ./program'\ ba \ w + \ b'

そしてそれは印刷します

0:リンゴ

PCRE_MULTILINEオプションを使用しようとしましたが、使用できません。すべての一致を出力する方法を教えてください。

4

1 に答える 1

2

探しているのは、Perl /gregexフラグと同等であり、可能な限り一致を繰り返し、すべての一致の結果を返すようです。PCREにそのようなものがあるとは思いません。

代わりに、の周りにループを追加する必要がありますpcre_exec。呼び出すたびに、一致の開始と終了のバイトオフセットが返されます。pcre_exec次に、試合の最後から文字列を再度実行します。pcre_exec一致しなくなるまで繰り返します。

于 2013-03-17T09:02:44.977 に答える