2

入力文字列のすべての「abc」と一致させたい。しかし、「最初のabc、2番目のabc、3番目のabc」と入力すると、次の結果が得られました。ovectorも出力します。

src: first abc, second abc, third abc
Matches 1
ovector: 6|9|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|

私のコード:

#include <stdio.h>
#include <string.h>
#include "pcre.h"

static const char my_pattern[] = "abc";
static pcre* my_pcre = NULL;
static pcre_extra* my_pcre_extra = NULL;

void my_match(const char* src)
{
    printf("src: %s\n", src);
    int ovector[30]={0};
    int ret = pcre_exec(my_pcre, NULL, src, strlen(src), 0, 0, ovector, 30);
    if (ret == PCRE_ERROR_NOMATCH){
        printf("None match.\n");
    }
    else{
        printf("Matches %d\n",ret);
    }
    printf("ovector: ");
    for(int i=0;i<sizeof(ovector)/sizeof(int);i++){
        printf("%d|",ovector[i]);
    }
    printf("\n");
    return;
}

int main()
{
    const char* err;
    int erroffset;
    my_pcre = pcre_compile(my_pattern, PCRE_CASELESS, &err, &erroffset, NULL);
    my_pcre_extra = pcre_study(my_pcre, 0, &err);
    my_match("first abc, second abc, third abc");
    return 0;
}

どうすればすべての「abc」を取得できますか、ありがとう。

4

1 に答える 1

1

pcre_exec一度に 1 つの一致のみを検索します。ovector部分文字列の一致用です。int ovector[30]={0};最大 10 個の一致が得られます (最後の 3 分の 1 (20-29) は使用されません)。最初の数字のペアはパターン全体用であり、次のペアは最初のキャプチャ括弧用です。たとえば、パターンを次のように変更した場合:

`static const char my_pattern[] = "(a(b)c)";`

次に、出力に表示されるはずです

Matches 3
ovector: 6|9|6|9|7|8|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|

この関数は、一致したキャプチャの数を返します。この場合は、パターン全体に対して 1 つ、サブパターン キャプチャに対して 2 つ、合計 3 つです。パターン全体が 6-9 に一致し、最初の括弧も 6-9 に一致し、2 番目の括弧は 7-8 に一致します。ovector[1]より多くの一致 (グローバル) を取得するには、ループを使用して、毎回前の一致 ( ) のオフセットを渡す必要があります。

http://www.pcre.org/pcre.txtを参照して、 pcre_exec() がキャプチャされた部分文字列を返す方法を検索してください

于 2013-11-30T06:43:13.303 に答える