Reguläre Ausdrücke - X{0}?.*

Status
Nicht offen für weitere Antworten.

Clip

Bekanntes Mitglied
Hallo,

ich suche einen regulären Ausdruck, der ausdrückt, dass ein String NICHT vorkommen darf.
Im Konkreten Fall möchte druchsuche ich Verzeichnisse nach bestimmten Dateien. Ich möchte Dateien oder Verzeichnisse die mit einem 'bis' beginnen nicht finden.
Dazu habe ich folgenden Ausdruck probiert.
^bis{0}?.*

Dazu steht in der JavaDoc zu Pattern;
Reluctant quantifiers
X?? X, once or not at all
X*? X, zero or more times
X+? X, one or more times
X{n}? X, exactly n times
X{n,}? X, at least n times
X{n,m}? X, at least n but not more than m times

Durch Angabe einer '0', hatte ich mir gewünscht dies auszudrücken.
Leider wird der Wert 0 aber anscheinend behandelt wie eine 1. So werden immer nur genau die Einträge gefunden, die mit 'bis' beginnen. Also genau das Gegenteil von dem was ich eigentlich tun möchte.
Da ich zum suchen eine "Finder API" benutze, und in dieser nicht zu speziell sein will, kann ich nicht einfach das den Rückgabewert des Matchers negieren. Ich möchte das Problem mit einem regulären Ausdruck lösen.

Kann mir jemand helfen? Gesucht ist ein Ausdruck der Einträge die mit einem 'bis' (CASE_INSENSITIVE) beginnen NICHT findet.

Danke
 
Warum baust du dir nicht einfach einen FileNameFilter und übergibst dem der File.listFiles()-Methode?

Das wäre einfacher als jetzt einen RegExp aufzusetzen...

Java:
      File f = new File( "." );
      File[] files = f.listFiles( new FilenameFilter()
      {
         @Override
         public boolean accept( File dir, String name )
         {
            return !name.startsWith( "bis" );
         }
      });

      for( File file : files )
      {
         try
         {
            System.out.println( file.getCanonicalPath() );
         }
         catch( IOException e )
         {
            // TODO Auto-generated catch block
            e.printStackTrace();
         }
      }
 
Zuletzt bearbeitet:
mikatchu hat gesagt.:
Warum baust du dir nicht einfach einen FileNameFilter und übergibst dem der File.listFiles()-Methode?

Klar gibt es viele gute Wege das zu verwirklichen. Der Filefilter ist sicher eine sehr gute.
Aber, ich möchte es es aus API Gründen mit einem regulärem Ausdruck hinbekommen.
Es muss doch einen Ausdrück geben der meine Anforderungen erfüllt!
 
[c]^[^(bis)].*[/c] scheint zu gehen.

War auch meine erste Idee. Bei mir nimmt er dann aber kein Wort, dass mit b anfängt. Das ^ scheint nur bei einem Zeichen zu funktionieren. Warum es aber auch nicht geht wenn man Zeichen wie du hier mit Klammern gruppiert ist mir ein Rätsel.

EDIT:
Da mir nichts besseres einfällt und du RegEx benutzen willst wär das mein Vorschlag:
Java:
static Boolean check(String s) {
		if(s.matches("^bis.*"))
			return false;
		else
			return true;
	}
 
Zuletzt bearbeitet:
reguläre Ausdrücke sind m.W. dafür gedacht zu überprüfen, ob eine Zeichenkette einem bestimmten Schema entspricht und nicht, um festzustellen, ob diese einem Schema nicht entspricht.
 
Folgender Ausdruck scheint zu gehen:
Code:
^([^b]|^.[^i]|^..[^s]).*

Das ist aber natürlich viel besser 🙂
Code:
(?!bis).+
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.

Zurück
Oben