C Reguläre Ausdrücke: Extrahieren der tatsächlichen Übereinstimmungen

Ich verwende reguläre Ausdrücke in C (mit der Bibliothek "regex.h"). Nachdem ich die Standardaufrufe (und -prüfungen) für regcomp (...) und regexec (...) eingerichtet habe, kann ich nur die tatsächlichen Teilzeichenfolgen drucken, die meinem kompilierten regulären Ausdruck entsprechen. Wenn Sie regexec verwenden, bedeutet dies gemäß den Handbuchseiten, dass Sie die Teilzeichenfolgen-Übereinstimmungen in einer Struktur speichern, die als "regmatch_t" bezeichnet wird. Die Struktur enthält nur rm_so und rm_eo, um auf die Adressen der Zeichen des übereinstimmenden Teilstrings im Speicher zu verweisen, aber meine Frage ist, wie ich diese nur für Offsets und zwei Zeiger verwenden kann, um den tatsächlichen Teilstring zu extrahieren und in diesen zu speichern ein Array (idealerweise ein 2D-Array von Strings)?

Dies funktioniert, wenn Sie nur auf Standardausgabe drucken. Wenn Sie jedoch versuchen, dasselbe Setup zu verwenden, es jedoch in einem Zeichenfolgen- / Zeichenarray zu speichern, wird die gesamte Zeichenfolge gespeichert, die ursprünglich zum Abgleichen mit dem Ausdruck verwendet wurde. Was ist das "%. * S" in der print-Anweisung? Ich stelle mir vor, es ist ein regulärer Ausdruck für sich, die Zeiger auf ein Zeichenarray richtig einzulesen. Ich möchte nur die übereinstimmenden Teilzeichenfolgen in einer Sammlung speichern, damit ich mit ihnen an einer anderen Stelle in meiner Software arbeiten kann.

Hintergrund: p und p2 sind beide Zeiger, die auf den Anfang der Zeichenfolge zeigen, die vor dem Eingeben der while-Schleife in den folgenden Code übereinstimmen sollen: [BEARBEITEN: "Übereinstimmungen" ist ein 2D-Array, das die Übereinstimmungen der Teilzeichenfolgen speichern soll und vorab zugewiesen / initialisiert wurde vor der Hauptschleife siehst du unten]

int ind = 0;
while(1){
    regExErr1 = regexec(&r, p, 10, m, 0);
    //printf("Did match regular expr, value %i\n", regExErr1);
    if( regExErr1 != 0 ){ 
        fprintf(stderr, "No more matches with the inherent regular expression!\n"); 
        break; 
    }   
    printf("What was found was: ");
    int i = 0;
    while(1){
        if(m[i].rm_so == -1){
            break;
        }
        int start = m[i].rm_so + (p - p2);
        int finish = m[i].rm_eo + (p - p2);
        strcpy(matches[ind], ("%.*s\n", (finish - start), p2 + start));
        printf("Storing:  %.*s", matches[ind]);
        ind++;
        printf("%.*s\n", (finish - start), p2 + start);
        i++;
    }
    p += m[0].rm_eo; // this will move the pointer p to the end of last matched pattern and on to the start of a new one
}
printf("We have in [0]:  %s\n", temp);

Antworten auf die Frage(2)

Ihre Antwort auf die Frage