2009-09-14 5 views
5

Non ho esperienza con l'uso di C, e ho bisogno di usare PCRE per ottenere le partite.
Ecco un esempio del mio codice sorgente:Come posso utilizzare PCRE per ottenere tutti i gruppi di incontri?

int test2() 
{ 
    const char *error; 
    int erroffset; 
    pcre *re; 
    int rc; 
    int i; 
    int ovector[OVECCOUNT]; 

    char *regex = "From:([^@]+)@([^\r]+)"; 
    char str[] = "From:[email protected]\r\n"\ 
        "From:[email protected]\r\n"\ 
        "From:[email protected]\r\n"; 

    re = pcre_compile (
      regex,  /* the pattern */ 
      0,     /* default options */ 
      &error,    /* for error message */ 
      &erroffset,   /* for error offset */ 
      0);     /* use default character tables */ 

    if (!re) { 
     printf("pcre_compile failed (offset: %d), %s\n", erroffset, error); 
     return -1; 
    } 

    rc = pcre_exec (
     re,     /* the compiled pattern */ 
     0,     /* no extra data - pattern was not studied */ 
     str,     /* the string to match */ 
     strlen(str),   /* the length of the string */ 
     0,     /* start at offset 0 in the subject */ 
     0,     /* default options */ 
     ovector,    /* output vector for substring information */ 
     OVECCOUNT);   /* number of elements in the output vector */ 

    if (rc < 0) { 
     switch (rc) { 
      case PCRE_ERROR_NOMATCH: 
       printf("String didn't match"); 
       break; 

      default: 
       printf("Error while matching: %d\n", rc); 
       break; 
     } 
     free(re); 
     return -1; 
    } 

    for (i = 0; i < rc; i++) { 
     printf("%2d: %.*s\n", i, ovector[2*i+1] - ovector[2*i], str + ovector[2*i]); 
    } 
} 

In questa demo, l'uscita è unica:

0: From:[email protected]
1: regular.expressions
2: example.com

voglio uscita tutta la le partite; Come lo posso fare?

+0

Non utilizzare un'espressione regolare ma un parser reale. Il protocoal di posta consente più di un semplice indirizzo di posta elettronica. – Gumbo

+0

Questa è una demo per pcre, voglio solo sapere come usare pcre nei gruppi corrispondenti. Grazie per il tuo commento. – tbmvp

+0

dovresti fare riferimento a questo post: http://stackoverflow.com/questions/7785557/pcre-match-all-groups-in-c – soulmachine

risposta

6

Uso una classe per eseguire il wrapping di PCRE per semplificare l'operazione, ma dopo il pcre_exec, l'ovice contiene gli indici di sottostringa necessari per trovare le corrispondenze all'interno della stringa originale.

Quindi sarebbe qualcosa di simile:

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

int main (int argc, char *argv[]) 
{ 
    const char *error; 
    int erroffset; 
    pcre *re; 
    int rc; 
    int i; 
    int ovector[100]; 

    char *regex = "From:([^@]+)@([^\r]+)"; 
    char str[] = "From:[email protected]\r\n"\ 
        "From:[email protected]\r\n"\ 
        "From:[email protected]\r\n"; 

    re = pcre_compile (regex,   /* the pattern */ 
         PCRE_MULTILINE, 
         &error,   /* for error message */ 
         &erroffset,  /* for error offset */ 
         0);    /* use default character tables */ 
    if (!re) 
    { 
     printf("pcre_compile failed (offset: %d), %s\n", erroffset, error); 
     return -1; 
    } 

    unsigned int offset = 0; 
    unsigned int len = strlen(str); 
    while (offset < len && (rc = pcre_exec(re, 0, str, len, offset, 0, ovector, sizeof(ovector))) >= 0) 
    { 
     for(int i = 0; i < rc; ++i) 
     { 
      printf("%2d: %.*s\n", i, ovector[2*i+1] - ovector[2*i], str + ovector[2*i]); 
     } 
     offset = ovector[1]; 
    } 
    return 1; 
} 
+0

Grazie per la risposta. Ma non so ancora come generare tutte le partite. – tbmvp

+0

Stai ricevendo solo il primo set di prodotti? Dovrai specificare l'opzione PCRE_MULTILINE quando compili la regex. Vedi: http://www.pcre.org/pcre.txt per i dettagli. Aggiornerò l'esempio –

+0

Ho aggiornato il codice nella mia risposta per fare quello che penso tu abbia bisogno. Sinceramente non sono un esperto di PCRE perché l'ho usato solo attraverso un wrapper, quindi non ho familiarità con le sue complessità. Penserei che ci sarebbe un modo per farlo con 1 chiamata a exec. e restituire l'array di ovetti con indici di stringa a tutte le partite. Questo dovrebbe fare il trucco però. –

5

nota: ultimo parametro di pcre_exec() deve essere elemento-count, non sizeof()! (http://www.pcre.org/readme.txt)

+1

Inoltre: il numero di elementi deve essere un multiplo di 3 (ad esempio 90 non 100!) – glob

+0

http://regexkit.sourceforge.net/Documentation/pcre/pcre_exec.html – glob

Problemi correlati