Archiv verlassen und diese Seite im Standarddesign anzeigen : Inverses Regexp Problem
Hallo zusammen,
ich hab folgendes Problem bei dem ich nicht weiter komme.
ich brauche eine Regexp Pattern in Java das alles matcht was nicht eine 1 ist.
1 ist dabei variable und sollte durch jede andere Zahl ersetzt werden koennen.
Also praktisch die inverse Menge von der Menge { 1 }
Mein erster Ansatz war [^1] , allerdings bekam ich dann auch die 11 , 111 usw. nicht gematcht
und auch [^1]{1} usw. haben mich nicht zum ziel gefuehrt
Waer super wenn mir jemand helfen kann
Firefall
27.03.2009, 15:44
Wozu matchen? Ersetze doch einfach die 1 mit "".
ich habe ja nicht gesagt, ich moechte die 1 ausloeschen.
damit vieleicht das Gesammtproblem klarer wird.
Ich habe eine Tabelle (genauer gesagt einen JXTable) bei dem ich einzelne Zeilen ausblenden moechte. Dies geht beim JXTable ueber Filter die u.a. dann auf basis von regexp arbeiten.
Das funktioniert dann halt folgendermassen, dass ein Filter die zeilen ausblendet zu denen er auf einer fest angegebenen Spalte nicht matcht.
Ich habe also eine Spalte mit einfach den Zeilennummern von 1 bis Anzahl der Eintraege... , will ich z.b. die Zeile 5 ausblenden brauche ich eine Regexp die noch auf alles matcht ausser der 5 (genau genommen kann man 'alles' einschraenken auf die Menge von Ganzzahlen...)
hoffe es kam verstaendlich rueber ;)
Edit: Moment, ich überleg nochmal kurz.
Edit 2: So. Nach einigem Hin und Her bin ich jetzt auf diese Regex gekommen:
^\d+$(?<!^15$)
Das matcht jetzt alles außer der 15. Puh.
:D
Edit 3: Mit "alles" meine ich natürlich die von dir oben erwähnten Ganzzahlen. ;D
dickes danke!!!
ersten tests sehen gut aus.
muss das mal versuchen nachzuvollziehen.. ich bin bis jetzt noch auf keinen gruenen zweig gekommen :mauer::D
War auch recht mind-twisting...
Also zuerst matcht er von vornherein eine oder mehr Ganzzahlen: ^\d+$
Danach kommt ein sogenannter "Negative Lookbehind" (das wäre dann das (?<!)) der ihm dann sagt, dass das was er soeben gematcht hat NICHT ^15$, also exakt 15 sein darf...
So in etwa lässt sich das erklären, ja... :D
uiuiui nedschlecht, naja halbwegs verstaendlich jetzt ja doch :)
Warum nicht einfach ein normales match auf
"^var$" und dann eben nur weiterarbeiten wenn
das Muster _nicht_ matched?
(Ist einfacher zu warten, verstehen und laeuft schneller - ausserdem sind
look ahead/behind Operationen ja fiese Extensions und gehen über das was reguläre
Ausdrücke können sollten hinaus ;) )
Jan Krüger
28.03.2009, 11:10
Naja, das klappt nicht, wenn du vorgefertigten Code benutzt, der es dir eben nicht erlaubt, das Ergebnis des Matches zu negieren, und danach klang das hier beschriebene Problem.
Das mit dem Negative Lookbehind ist übrigens auch die einzige universelle Lösung, die mir bis jetzt eingefallen ist. Um alles zu matchen, das nicht genau "1" ist, gibt es aber noch eine einfachere Lösung (bzw. eine mit simpleren Konstrukten, die auch tatsächlich in so ziemlich jedem RegExp-Dialekt irgendwie umsetzbar sein sollte):
^(|[^1]|.{2,})$
Im Detail: matche den leeren String oder ein einzelnes Zeichen, das keine 1 ist oder einen String, der mindestens zwei Zeichen lang ist.
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.