Verstehe einen Regex nicht

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Judge
User
Beiträge: 129
Registriert: Mittwoch 13. Juni 2012, 22:27
Wohnort: Ratingen
Kontaktdaten:

Hallo zusammen,

Ich möchte in einer Liste solche Elemente identifizieren, die ein bestimmtes Zeichen nicht enthalten.
In der Liste gibt es viele Elemente, die auf eine der beiden folgenden Arten aufgebaut sind:

Code: Alles auswählen

BLAHBLAH="FOO"
SCHNICKSCHNACK["0815"]="BAR"
Ich möchte nun einen Regex haben, der mir solche Strings, in denen '\]( +|)=' NICHT vorkommt. Also: Nur die erste Variante soll matchen.
Ich habe Gegoogled und bin auf die so genannten "Negative Lookahead"s gestoßen. Diese sollen angeblich so funktionieren:

Code: Alles auswählen

(?!xxx)
und, soweit ich das verstehe: Genau das tun. In meinem Fall sollte also:

Code: Alles auswählen

^.*(?!\])( +|).*$
doch genau zu dem führen, was ich brauche, oder?
Ich meine den String wie folgt zu beschreiben:
^ = Beginn
.* = Irgendwas
(?!\]) = KEINE ]
( +|) = kein, ein oder mehrere Leerzeichen
.* = Irgendwas
$ = Ende

Wo ist mein Fehler? Laut Pythex stimmt da was nicht ...
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@Judge: der viel einfachere Fall wäre "^[^\[\]=]+=.*$"
Benutzeravatar
Judge
User
Beiträge: 129
Registriert: Mittwoch 13. Juni 2012, 22:27
Wohnort: Ratingen
Kontaktdaten:

... danke für das lösen des Brettes vor meinem Kopf! :oops:

PS: Wobei ich eines trotzdem nicht ganz verstehe:
Warum ist ein "=" in der negated char class?
BlackJack

@Judge: Ist für das reine Testen nicht zwingend notwendig, macht aber deutlicher wie die Zeichenkette aussehen muss und ist unter Umständen effizienter.

Bei 'parrot=answer=42' matched der erste Teil *ohne* das '=' in der negierten Zeichenklasse nämlich 'parrot=answer' und nicht nur 'parrot'. Spätestens wenn man nicht nur wissen will *ob* die Zeile matched, sondern auch die beiden Bestandteil als Gruppen haben möchte, muss man das '=' also in der Zeichenklasse haben.

Bei 'parrot=answer[x]=42' ist es sehr wahrscheinlich effizienter, weil da mit '=' in der Zeichenklasse beim ersten '=' die Trennung klar ist, ohne dagegen der Teilausdruck mit der Zeichenklasse erst einmal bis zum '[' geht, und von da wieder Rückwärts gesucht wird ob und wenn ja wo, der erste Teilausdruck so matched, dass der Rest auch passt. http://regex101.com/ gibt für die Zeichenklasse ohne '=' 13 Schritte an, für die Zeichenklasse mit '=' nur 6.

Edit: Das kann man sich auf der Webseite auch im Regex-Debugger ganz hübsch anzeigen lassen wo da das Backtracking passiert.
Benutzeravatar
Judge
User
Beiträge: 129
Registriert: Mittwoch 13. Juni 2012, 22:27
Wohnort: Ratingen
Kontaktdaten:

Danke für die Erklärung :)
Antworten