2016-04-07 18 views
-1

Ich versuche, Dateien im Verzeichnis in C# zu filtern.C# Wie schreibe ich Regular Expression Filter

Ich denke, Regex der beste Weg ist, aber ich bin in Schwierigkeiten den Ausdruck zu schreiben ... kann mir jemand helfen ...

Hier mein Code:

Regex reg = new Regex(Expr); 
var files = Directory.GetFiles(Dir, "*.txt") 
       .Where(path => reg.IsMatch(path)) 
       .ToList(); 

Mein Expression Expr würde finde alle Dateien, die mit "fileXXX" beginnen und nicht mit "_L.txt" enden, wie kann ich mein Problem lösen?

Vielen Dank!

+0

Hier ist eine [ähnliche] (http://stackoverflow.com/questions/9653201/directory-getfiles-show-only-files-star-ting-with-a-numeric-value). Ihr 'Pfad' enthält den Dateipfad, nicht nur den Dateinamen. –

+0

Was ist 'XXX'? 3 Ziffern? Wenn das ein Literal ist, brauchen Sie hier keine Regex. –

Antwort

0

Wenn die fileXXX eine wörtliche, können Sie erreichen, was Sie brauchen, um mit einem bloßen StartsWith und EndsWith:

var files = Directory 
    .EnumerateFiles(Dir, "*.txt") 
    .Where(path => Path.GetFileNameWithoutExtension(path).StartsWith("fileXXX") 
       && !Path.GetFileNameWithoutExtension(path).EndsWith("_L")) 
    .ToList(); 

Beachten Sie, dass Ihre path enthält die Dateipfad einschließlich der Ordnerpfad, nicht nur die Datei Name. Deshalb müssen Sie Path.GetFileNameWithoutExtension(path) verwenden, um die Überprüfung durchzuführen.

Else, verwenden Sie einen regulären Ausdruck wie

var files1 = Directory 
    .GetFiles(Dir, "*.txt") 
    .Where(path => Regex.IsMatch(Path.GetFileNameWithoutExtension(path), @"^fileXXX.*(?<!_L)$")) 
    .ToList(); 

Wo ^fileXXX.*(?<!_L)$ beliebigen Text übereinstimmt (hier ein Dateiname ohne Erweiterung), die mit fileXXX beginnt und mit _L (aufgrund der negativen Lookbehind (?<!_L) nicht vor einem Ende Ende des Schnurankers $).