*erledigt* Reguläre Ausdrücke negieren

Kraeuterdude

Painkiller
Registriert
15 Juli 2013
Beiträge
244
Ort
127.0.0.1
Hallo Zusammen,

habe ein spezielles Problem mit regulären Ausdrücken.

Ich will ein Feld in der Datenbank filtern, welches Emailadressen, Namen und UserID's enthält.

Die UserID's fangen mit I,C oder D an gefolgt von einer 6-7 stelligen Zahl. Diese will ich ausklammern. D.h. ich will filtern nach allem, was nicht mit einer UserID nach diesem Format anfängt. Dazu muss ich den Ausdruck negieren. Dies kann ich leider nicht direkt im Script machen, sondern muss dieses im regulären Ausdruck machen.

Folgenden Ausdruck habe ich bereits negativ getestet:
PHP:
Expand Collapse Copy
/^([^CDI]{1}[0-9]{6,7})/i

Hat jemand eine Idee, wie ich da weiterkomme?

Danke und Grüße
 
Zuletzt bearbeitet:
Re: Reguläre Ausdrücke negieren

Falls du (wie dein Code vermuten lässt) reguläre Ausdrücke in PCRE-Syntax zur Verfügung hast, liesse sich das über eine negative look-ahead (oder -behind) assertion lösen, siehe .

Zum Beispiel:
[src=pcre]/^(?![CDI][0-9]{6,7})/i[/src]
 
Zuletzt bearbeitet:
  • Thread Starter Thread Starter
  • #3
Re: Reguläre Ausdrücke negieren

Ich teste momentan mit dieser Seite

Habe dort folgendes als Datensatz folgendes eingegeben:

Code:
Expand Collapse Copy
astdiausod
asgdiauosdpü
c362574
sjhdfgsd32748723#
mail@domain.com
I1763478
test

Normalerweise müsste er mir doch alles markieren, außer Zeile 3 und 6, sollte der reguläre Ausdruck stimmen?
Funktioniert nur leider nicht.
 
Re: Reguläre Ausdrücke negieren

Das Problem bzw. das Missverständnis ist, dass eine look-ahead oder look-behind assertion immer die Länge 0 hat. Würdest du in deinem Beispiel den regulären Ausdruck zeilenweise anwenden, würde er auf alle Zeilen ausser `c362574` und `I1763478` passen, als Match jedoch immer einen leeren String liefern. Möchtest du die Zeile als Match, wäre
[src=pcre]/^(?![CDI][0-9]{6,7}).*?$/i[/src]
passend, wobei bei einem nicht-zeilenweisen Matchen wie auf regexpal.com zusätzlich auch eingestellt werden muss, dass sich ^ und $ auf Zeilen und nicht auf den Gesamttext beziehen (Modifier m).
 
Zuletzt bearbeitet:
  • Thread Starter Thread Starter
  • #5
Re: Reguläre Ausdrücke negieren

Hi Kugelfisch,

das funktioniert schon wunderbar. Jetzt habe ich nur noch das Problem, dass er mir ebenfalls

D2378478888

nicht matcht. Eigentlich müsse das auch gematcht werden, da es länger als max. 8 Zeichen hat. Hab kaum Ahnung von regulären Ausdrücken, daher komm ich da nicht weiter, obwohl es wahrscheinlich sehr einfach ist.

Kannst du nochmal schauen, ob das möglich ist? Lasse dich dann auch in Ruhe :P

regex.JPG

Edit:

Hab die Lösung: ^(?![CDI][0-9]{6,7}$).*?$

Vielen vielen Dank Kugelfisch :D
 
Zuletzt bearbeitet:
Zurück
Oben