2009-10-27 20 views
14

Es ist 10 Jahre her, seit ich c ansah. Ich muss ein kleines Programm in c schreiben, das eine Zeichenfolge analysiert. Ich wollte reguläre Ausdrücke verwenden, da ich sie seit Jahren benutze, aber ich habe keine Ahnung, wie man das in c macht. Ich habe den Morgen damit verbracht, zu googlen und ich kann keine einfachen Beispiele finden (dh, benutze diese Bibliothek, das ist die Methode). Kann mir jemand ein einfaches Beispiel geben?c regulären Ausdruck Howto

Danke!

Antwort

38

können Sie PCRE verwenden:

Die PCRE-Bibliothek ist eine Reihe von Funktionen, die Muster für reguläre Ausdrücke implementieren mit der gleichen Syntax und Semantik wie Perl passende 5. PCRE seine eigene native API hat, sowie eine Satz von Wrapper-Funktionen, die der POSIX-API für reguläre Ausdrücke entsprechen. Die PCRE-Bibliothek ist kostenlos, selbst zum Erstellen kommerzieller Software.

Siehe pcredemo.c für ein PCRE-Beispiel.

Wenn Sie PCRE nicht verwenden können, ist wahrscheinlich POSIX regular expression Unterstützung auf Ihrem System verfügbar (as @tinkertim pointed out). Unter Windows können Sie gnuwin Regex for Windows package verwenden.

Die regcomp Dokumentation enthält das folgende Beispiel:

#include <regex.h> 

/* 
* Match string against the extended regular expression in 
* pattern, treating errors as no match. 
* 
* Return 1 for match, 0 for no match. 
*/ 

int 
match(const char *string, char *pattern) 
{ 
    int status; 
    regex_t re; 

    if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB) != 0) { 
     return(0);  /* Report error. */ 
    } 
    status = regexec(&re, string, (size_t) 0, NULL, 0); 
    regfree(&re); 
    if (status != 0) { 
     return(0);  /* Report error. */ 
    } 
    return(1); 
} 
+0

+1, obwohl POSIX nicht vorhanden ist, ist pcre auf fast allen modernen Systemen zur Verfügung. –

+0

Danke! Gibt mir einen schönen Ausgangspunkt. – jeffkolez

+0

Dies ist eine nette, nützliche und kooperative Antwort. Ich hoffe, dass diese Frage mehr Stimmen bekommt, da Regex in C je nach Plattform knifflig sein kann. –

0

Eine weitere Option neben einer nativen C-Bibliothek ist eine Schnittstelle zu einer anderen Sprache wie Python oder Perl zu verwenden. Sie müssen sich nicht mit der String-Behandlung von C auseinandersetzen, und die bessere Sprachunterstützung für Regex sollte Ihnen die Dinge viel leichter machen. Sie können auch ein Tool wie SWIG verwenden Wrapper zu erzeugen, um den Code von C. Aufruf

+0

Es sollte nie eine gute Idee sein, sich in ein anderes Programm zu begeben, es sei denn, es ist absolut die einzige Möglichkeit, diese Aufgabe zu erfüllen. –

+0

@NathanAdams nichts in dieser Antwort ist über das Beschuss zu einem anderen Programm. – hobbs

6

Wenn nur in POSIX gezwungen (kein PCRE), hier ist ein Leckerbissen des Falles zurück:

#include <regex.h> 
#include <stdbool.h> 

bool reg_matches(const char *str, const char *pattern) 
{ 
    regex_t re; 
    int ret; 

    if (regcomp(&re, pattern, REG_EXTENDED) != 0) 
     return false; 

    ret = regexec(&re, str, (size_t) 0, NULL, 0); 
    regfree(&re); 

    if (ret == 0) 
     return true; 

    return false; 
} 

Sie könnten es nennen dies wie:

int main(void) 
{ 
    static const char *pattern = "/foo/[0-9]+$"; 

    /* Going to return 1 always, since pattern wants the last part of the 
    * path to be an unsigned integer */ 
    if (! reg_matches("/foo/abc", pattern)) 
     return 1; 

    return 0; 
} 

I sehr empfehlen Verwendung von PCRE, wenn seine zur Verfügung stellen. Aber es ist nett, nach etwas zu suchen und irgendwie zurückzufallen.

Ich zog die Snippets aus einem Projekt in meinem Editor. Es ist nur ein sehr einfaches Beispiel, aber gibt Ihnen Arten und Funktionen zu suchen, wenn Sie sie brauchen. Diese Antwort verstärkt Sinans Antwort mehr oder weniger.

+0

Danke - schöne Beispiele.Ich bin mir der Umgebung noch nicht sicher, daher ist es praktisch, ein Backup zu haben, falls PCRE nicht verfügbar ist. – jeffkolez

+1

@jeffkolez Viel Glück bei Ihrem Projekt. 10 Jahre, seit du C berührt hast ... und hier bist du in einer seiner dunklen Ecken. Sollten Sie sich entscheiden, Ihren Computer zu schießen, denken Sie bitte daran, zuerst eine NERF Pistole zu kaufen. –

0

Sie sollten auch einen Blick auf die Regex-Bibliothek werfen. Es verwendet reguläre Ausdrücke wie die, die Sie in die Linux Shell schreiben können.

Weitere Informationen unter Linux, Typ „Mann regcomp“ ohne Anführungszeichen

+0

Dadurch werden keine neuen Informationen hinzugefügt, die bereits in anderen Antworten verfügbar sind. –