Überprüfung eines Wertes durch reguären Ausdruck schlägt fehl
-
Hallo @ all,
ich bin ein C-Frischling und hab folgendes Problem:
Mein definierter regulärer Ausdruck wird nicht korrekt verglichen. Da ich im Ausdruck eine minimale/maximale Anzahl definiert habe wundere ich mich, warum er mir trotz der Tatsache, dass mein zu prüfender Begriff zu lang ist nicht auf einen Fehler läuft.
Ich rufe über regcomp alles auf.Die Variablen sind wie folgt definiert:
// Global
regex_t regexpr;
char regaus[256];
int regausrc=0;regaus wird über eine seperate Datei ausgelesen und hat z.B. folgenden Wert:
[A-Za-z0-9]{4,9}
Der zu prüfende Wert ist Alphanumerisch und z.B.
AB3 --> 3 Stellig --> Fehler (korrekt)
AB34567890 --> 10 Stellig --> kein Fehler (nicht korrekt).Der Aufruf
regcomp(®expr, regaus, REG_EXTENDED|REG_NEWLINE); regausrc = regexec(®expr, yylval.string, 0, NULL, 0); // im Fehlerfall soll er hier reingehen und meine Anweisung ausführen if (regausrc != 0 ) { printf(yyout,"Fehler\n"); // genauere Aufsplittung im Original, hier nur aus Beispielgründen eine Vereinfachung }
Wie bereits erwähnt ich steh auf dem Schlauch und komme nicht mehr weiter. Ich habe den regulären Ausdruck sooft zum testen geändert, dass mir schon ganz schwummrig wird
.
Daher bitte ich euch, eure Erfahrungen / Ideen zu meinem Problem zu schreiben. Vielleicht gibts auch komplette Verbesserungsideen / Ansätze.
Für die die sich fragen wie ich überhaupt auf dieses Problem gekommen bin, hier eine kurze Erläuterung:
Ich arbeite im Bereich EDI (Elektronischer Datentransfer) und muss eine Datei auf bestimmte Merkmale überprüfen. Zum einen auf den Inhalt (N/AN), die Länge, ob überhaupt gefüllt und noch einiges mehr. Da das ganze größtenteils mit lex/yacc gemacht wird, werden diese Prüfungen über C ausgeführt. Leider haben diese Ergebnisse wie oben im Beispiel nicht die von mir erwarteten Ergebnisse..
Ich bin für alle Hinweise dankbar.
greez
-
Es ist zwar eine Weile her, aber ich meine mich dunkel zu erinnern, daß die Auswertung angehalten wird, wenn der übergebene Ausdruck zu Ende ist - das würde bedeuten, daß die regexec() die Adresse eines char* mitbekommt, der auf das erste Zeichen hinter dem Ausdruck umgebogen wird (analog zu strdol).
-
wau
Das war mal eine schnelle Antwort. Vielen Dank erstmal.
Leider kommen mit deiner Antwort neue Fragen auf
.
Versteh ich dich richtig, dass sozusagen nur der Wert bis zu Stelle 9 in meinem Beispiel verglichen wird? Da dieser Teil richtig ist gibt er mir auch den Return Code 0 zurück. Kann ich dann mit einem "" nicht so wie ich es dachte.
([0-9a-zA-Z ]{4,9})$
--> bei String mit 3 Zeichen --> RC = 1 (Fehler)
--> bei String mit 10 zeichen --> RC = 0Wenn dem so ist, hast du dann vielleicht eine Idee wie ich mir hier einen anderen RC basteln kann (kleiner Workaround). Vom Prinzip her kann ich ja auch jede Datei selbst mit strlen auf die Länge überprüfen und auf min/max mit jeweils eigener Variable prüfen. Dies wollte ich aber eigentlich nur machen, wenn ein Fehler aufgetreten ist (da ich ca. 10 Sachen abprüfen müssen).
-
Versuch mal ^[A-Za-z0-9]{4,9}$
-
-
@ feigling
feigling schrieb:
Versuch mal ^[A-Za-z0-9]{4,9}$
Klasse - vielen Dank.so passt es. Ich dachte eigentlich, dass es eindeutig wäre und ich den Stringanfang nicht noch mitgeben müsste. Vor sovielen Bäumen hab ich wohl den Wald aus den Augen verloren.
@ Vista
soviel gesurft und gegoogelt (sogar yahoo'ed :p ), aber auf die Idee nen Tester zu suchen bin ich ned gekommen.....Vielen Dank nochmal an alle. Dann kann ich endlich zum nächsten Schritt gehen.