Frage

Ist es möglich, zu zählen, wie oft ein Teil in einer Zeichenfolge erscheint mit GNU regex Matching libc regexec ()?

War es hilfreich?

Lösung

Nein, regexec () findet nur ein Spiel pro Anruf. Wenn Sie das nächste Spiel finden wollen, müssen Sie es nennen wieder weiter entlang der Saite.

Wenn Sie nur für ebenen Teil suchen wollen, sind Sie viel besser dran mit der Standard-C string.h Funktion strstr () ; dann müssen Sie sich nicht um Flucht spezielle Regex Zeichen kümmern.

Andere Tipps

regexec kehrt in seinem vierten Parameter „pmatch“ eine Struktur mit allen Spielen. „Pmatch“ ist eine feste Größe Struktur, wenn es mehr Übereinstimmungen sind, werden Sie die Funktion eine andere Zeit nennen.

Ich habe diesen Code mit zwei verschachtelten Schleifen gefunden und ich habe es geändert. Die ursprüngliche cod Sie cand es finden in http://www.lemoda.net/c /unix-regex/index.html :

static int match_regex (regex_t * r, const char * to_match)
{
    /* "P" is a pointer into the string which points to the end of the
       previous match. */
    const char * p = to_match;
    /* "N_matches" is the maximum number of matches allowed. */
    const int n_matches = 10;
    /* "M" contains the matches found. */
    regmatch_t m[n_matches];
    int number_of_matches = 0;
    while (1) {
        int i = 0;
        int nomatch = regexec (r, p, n_matches, m, 0);
        if (nomatch) {
            printf ("No more matches.\n");
            return nomatch;
        }
        for (i = 0; i < n_matches; i++) {
            if (m[i].rm_so == -1) {
                break;

            }
            number_of_matches ++;
        }
        p += m[0].rm_eo;
    }
    return number_of_matches ;
}

Entschuldigung für eine andere Antwort zu schaffen, weil ich nicht mehr als 50 Ruf. Ich kann nicht @Oscar Raig Colon Antwort kommentieren.

pmatch können alle Substrings nicht übereinstimmen, pmatch verwendet wird, die von Offset für subexpression zu sparen, ist der Schlüssel zu verstehen ist, was ist subexpression, subexpression ist "\ (\)" in BRE, "()" in ERE. wenn es nicht subexpression in gesamten regulären Ausdruck, regexec () geben nur die erste Begegnung String-Offset und legte es auf pmatch [0].

Sie können beispielsweise bei [ http: / /pubs.opengroup.org/onlinepubs/007908799/xsh/regcomp.html][1]

Im Folgenden wird gezeigt, wie die REG_NOTBOL Flagge mit regexec verwendet werden könnte (), um all Teil in einer Linie zu finden, die ein Muster von einem Benutzer gelieferten Parameter passen. (Zur Vereinfachung des Beispiels sehr wenig Fehlerprüfung durchgeführt wird.)

(void) regcomp (&re, pattern, 0);
/* this call to regexec() finds the first match on the line */
error = regexec (&re, &buffer[0], 1, &pm, 0);
while (error == 0) {    /* while matches found */
    /* substring found between pm.rm_so and pm.rm_eo */
    /* This call to regexec() finds the next match */
    error = regexec (&re, buffer + pm.rm_eo, 1, &pm, REG_NOTBOL);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top