Regex und Negation
Marcel
- programmiertechnik
Hallo
Ich habe immer wieder Probleme wenn ich bei den Regex etwas negieren möchte. Ich möchte hier zum Beispiel alle Nummern auslesen, welche davor kein < oder / haben. Kann mir jemand verraten warum das sor nicht klappt?
[^(<|/)][0-9]+
Gruss Marcel
Hallo
Habs gerade mal noch so versucht:
(?<=[^(<|/)])[0-9]+
Dann habe ich aber das Problem, dass die zweite Ziffer der Nummer auch erkannt wird sobald sie mehr als zwei Stellen besitzt und davor ein < oder ein / ist.
Gruss Marcel
Lieber Marcel,
[^(<|/)]
dieses Konstrukt ist Unsinn. Wenn Du etwas in eckige Klammern schreibst (etwa so: [xyz]), dann bedeutet das "ein Zeichen, das entweder ein 'x', 'y' oder 'z' ist". Dieses Konstrukt nennt man eine Character Class, denn Du definierst damit eine Klasse an Zeichen, die Du suchst. Negiert wird eine Character Class mit einem "^" Zeichen, das in der Character Class irgendwo stehen kann (am besten aber am Anfang, denn es erleichtert das Lesen).
Eine runde Klammer in dieser Character Class hat nicht die Bedeutung, die sie außerhalb hat. Innerhalb der Character Class steht eine runde Klammer für das Zeichen, aus dem sie besteht. Ein Suchmuster der Art [^(<|/)] bedeutet "ein Zeichen, dass weder '(', '<', '|', '/' noch ')' ist", wobei Du "<" mit einem Backslash escaped hast (wozu?).
Ich verwende zum Nachschlagen für RegExe gerne http://www.regular-expressions.info/ (englisch!), da dort ein wunderbar einfach gehaltenes Tutorial angeboten wird.
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Die Klammern bringen wohl den Parser durcheinander, wahrscheinlich ist der Ausdruck sogar falsch, ich habe das nicht nachgeprüft. Zudem musst du nur den Forwardslash / als Sonderzeichen deklarieren, das Kleiner wird vom Parser auch so akzeptiert:
[^</][0-9]+
besser könnte aber sogar sein
[^</]\d+
Wenn \d bei deinem Parser für Digit steht.
Gruß,
Flash