Laden...

RegEx Problem mit xxx(?!yy)zzz

Erstellt von Cornflake vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.458 Views
C
Cornflake Themenstarter:in
142 Beiträge seit 2007
vor 8 Jahren
RegEx Problem mit xxx(?!yy)zzz

Hallo Leute

Weiß jemand eine Lösung zu folgender Situation:
x = beliebiger Text

VorgabeTabelle


xxxx44xxxxx
xxxx54xxxxx
xxxx45xxxxx
xxxx46xxxxx
xxxx55xxxxx
xxxx54xxxxx
xxxx56xxxxx
xxxx46xxxxx

Jetzt will ich nur die Zeilen behalten, die ab stelle 5 ein "54" enthalten. Die restlichen Zeilen sollen weg.

Wisst ihr wie man das per RegEx lösen kann?

Mein aktueller Entwurf wäre:


^.{4}(?!54).+\r\n

Das findet er aber nicht, da wie ich rausgefunden habe,
der Assert (look behind, look ahead) mit (?...) nicht zwischen zwei Begriffen stehen kann, sondern nur am Anfang oder Ende.

Gibt es denn bei RegEx eine Lösung für eine "negativ" Suche ?(

Grüße Cornflake

2.078 Beiträge seit 2012
vor 8 Jahren

Wozu brauchst Du eine "negative" Suche?
Wenn nur die Zeilen gefunden werden sollen, die ein "54" enthalten, dann baust Du das Pattern einfach genau so auf.

Ich hab das hier mal getestet: https://regex101.com/r/pS8oR5/1

Dennoch gibt es die "negative" Suche.
Dafür brauchst Du eine Gruppe, die das matcht, was geprüft wird - egal ob die Bedingung erfüllt wird oder nicht, dann kannst Du davor ein Negative Lookahead setzen.

Hier ein Beispiel: https://regex101.com/r/pS8oR5/2

Über die entsprechenden Zeilen kannst Du dann mit einem einfachen Where drüber laufen und für jedes Item prüfen, ob es matcht.
Ich empfehle dann aber, eine Regex-Instanz zu verwenden und die compilen zu lassen. Ich hab's nicht getestet, vom Verständnis her sollte das bei großen Datenmengen aber einen Performance-Vorteil bedeuten.

C
Cornflake Themenstarter:in
142 Beiträge seit 2007
vor 8 Jahren

Hallo Palladin
Das mit dem negativen Suchen ist nur, da ich den RegEx nicht direkt in C# schreibe, sondern in einem Programm, dass RegEx unterstützt.
Ich kann nur "Suchen nach" und "Ersetzen durch" machen.
Daher wenn ich alles löschen will ausser "54" muss ich alles mit Regex finden, außer "54".

Habe es jetzt hinbekommen. Danke für deine Antwort.
Das mit dem www.regex101.com kannte ich noch nicht. geniales Teil 😃 THX

Grüße Cornflake

49.485 Beiträge seit 2005
vor 8 Jahren

Hallo Cornflake,

Habe es jetzt hinbekommen.

wenn du eine eigene Lösung gefunden hast, kommt es immer gut, sie auch für die Nachwelt zu schreiben. 😃

der Assert (look behind, look ahead) mit (?...) nicht zwischen zwei Begriffen stehen kann

Nein, ein look behind/ahead kann überall stehen. Er zählt nur eben immer als 0 Zeichen breit, egal wie viele Zeichen er umfasst. Dein Pattern "frisst" also das 54 bzw. die beiden anderen Ziffern, die stattdessen dort stehen, nicht weg. Falsch wäre also ^.{4}(?!54).{5}\r\n, denn von der Stelle, wo dein look ahead passt (bzw. nicht passt) sind es noch zwei Ziffern und fünf x bis zum Zeilenende. Richtig wäre also

^.{4}(?!54).{7}\r\n oder
^.{4}(?!54)...{5}\r\n oder vielleicht noch klarer
^.{4}(?!54)\d\d.{5}\r\n oder noch einfacher
^.{4}(?!54), denn was für Ziffern außer der 54 kommen und was am Ende der Zeile kommt, ist dir ja eh egal.

Dein Pattern ist also auch richtig. Wenn er nicht passt, dann wohl eher wegen des \r\n (besser $, bei fortlaufendem Text statt einzelnen Zeilen noch mit RegexOptions.Multiline) oder wegen einer falsch gesetzten Singlline Option.

herbivore