2016-09-26 2 views
1

Ich versuche, FTP ListDirectoryDetails Antwort zu analysieren, die von FileZilla FTP-Server kommt.Parsing Dateiname aus ListDirectoryDetails mit Regex

Das Hauptproblem ist, dass der FileZilla Server unterschiedliche Ausgaben in verschiedenen Sprachen (Kulturen) liefert.

Ich habe zwei folgende Ausgabe von FileZilla Server und beide müssen analysiert werden, was ich nicht erreichen konnte.

Format ist unten gezeigt:

drwxr-xr-x 1 ftp ftp    0 Sep 02 17:07 Can 
-rw-r--r-- 1 ftp ftp    0 Jun 27 2016 Fan 
drwxr-xr-x 1 ftp ftp    0 Sep 21 12:29 AA AA 
-rw-r--r-- 1 ftp ftp    44 Sep 02 17:07 Debug.txt 

Ich versuchte Regex zu verwenden, um dieses Problem zu lösen, aber es funktioniert nicht, wenn die Kompilierung.

Meine regex ist:

(?<permissions>[drwx\-]+((?<userandgroup>[A-Za-z]+ [A-Za-z]+) (?<size>\d+) (?<date>[A-Za-z]+ [\d:]+) (?<name> .*) 

Ich brauche robusten regex. Vielleicht sollte nur Dateiname passenden Regex besser sein.

Wie kann ich nur Dateiname mit Regex übereinstimmen?

+0

Ich denke, die zweite '(' sollte ')'. Siehe https://regex101.com/r/jK5dL8/1 (nicht '(? [drwx \ -] + (', aber '(? [drwx \ -] +)') –

+0

Ich reparierte die Regex wie Sie erwähnt, aber es teilt Antwort auf Gruppen leider nicht auf. Leider Kompilierfehler gelöst –

+0

Wenn Sie Daten zur Verfügung stellen, um als Text zu testen, kann ich - oder mehr SO Benutzer - Ihnen weiter helfen. –

Antwort

2

nur einen Dateinamen zu analysieren, aus, nur den 9. Token erhalten:

^(?:[^ ]+ +){8}(.*)$ 
Regex regex = new Regex("^(?:[^ ]+ +){8}(.*)$"); 
Match match = regex.Match(line); 
string filename = match.Groups[1].Value; 

Obwohl für eine solche einfache Analyse, können Sie spalten tatsächlich die Linie zu Tokens durch Raum. Sie brauchen keinen regulären Ausdruck.

string[] tokens = line.Split(new[] { ' ' }, 9, StringSplitOptions.RemoveEmptyEntries); 
string filename = tokens[8]; 

Aber wenn Sie nur einen Dateinamen benötigen, nicht die ListDirectoryDetails in erster Linie verwenden. Verwenden Sie die ListDirectory. Es gibt nur den Dateinamen zurück.


Und wenn Sie Dateiattribute müssen Parsen, verwenden Sie einen FTP-Client, der den FTP-MLSD-Befehl unterstützt. Die FtpWebRequest unterstützt dies nicht.

+1

Dieses fängt den Namen AA AA nicht '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '. StringSplitOptions.RemoveEmptyEntries); 'damit' tokens [8] 'alles nach den ersten 8 Token hat. – AdrianHHH

+0

@AdrianHHH Richtig, danke, ich habe meine Antwort geändert. –

1

Der reguläre Ausdruck in der Frage ist: regex ist:

(?<permissions>[drwx\-]+((?<userandgroup>[A-Za-z]+ [A-Za-z]+) (?<size>\d+) (?<date>[A-Za-z]+ [\d:]+) (?<name> .*) 

Es gibt mehrere Probleme mit diesem Ausdruck.

  • Die 2. '(' sollte ein 'sein).
  • Die Linkanzahl ist nicht vorhanden. Fügen Sie (\d+) (plus ein Leerzeichen) zwischen den ersten beiden Erfassungsgruppen hinzu.
  • Es darf nur ein einzelner Speicherplatz zwischen den userandgroup und den size Erfassungen erlaubt sein. Fügen Sie eine + vor (?<size>\d+) hinzu.
  • Der Tag des Monats wird nicht abgeglichen. Ersetzen Sie den einzelnen Platz in der date Erfassung mit [\d]+ (es muss einen Platz auf jeder Seite haben).
  • Der name Erfassung wird ein Leerzeichen vorangestellt und ein Leerzeichen als erstes Zeichen /. Löschen Sie einen von ihnen.

diese Verbesserungen Merging gibt den Ausdruck:

(?<permissions>[drwx\-]+) (\d+) (?<userandgroup>[A-Za-z]+ [A-Za-z]+) +(?<size>\d+) (?<date>[A-Za-z]+ [\d]+ [\d:]+) (?<name>.*)