用正则表达式解析ListDirectoryDetails中的文件名

本文关键字:文件名 ListDirectoryDetails 正则表达式 | 更新日期: 2023-09-27 18:09:04

我正在尝试解析来自FileZilla FTP服务器的FTP ListDirectoryDetails响应。

主要问题是FileZilla服务器在不同的语言(文化)中给出不同的输出。

我有两个来自FileZilla服务器的以下输出,都必须被解析,这是我无法实现的。

格式如下:

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

我尝试使用正则表达式来解决这个问题,但它在编译时失败。

我的正则表达式是:

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

我需要更健壮的正则表达式。也许只有文件名匹配regex应该更好。

如何只匹配文件名与正则表达式?

用正则表达式解析ListDirectoryDetails中的文件名

要解析文件名,只需获取第9个标记:

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

对于这样一个简单的解析,您实际上可以按空格将该行拆分为多个令牌。不需要正则表达式

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

但是如果您只需要一个文件名,那么首先不要使用ListDirectoryDetails。使用ListDirectory。它只返回文件名


如果需要解析文件属性,请使用支持FTP MLSD命令的FTP客户端。FtpWebRequest不支持这个

问题中的正则表达式为:regex =

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

这个表达式有几个问题。

  • 第二个'('应该是')'。
  • 链路计数缺失。在前两个捕获组之间添加('d+)(加一个空格)。
  • 只允许在userandgroupsize捕获之间有一个空格。在(?<size>'d+)前添加+
  • 不匹配日期。用['d]+替换date捕获中的单个空格(两边必须有一个空格)。
  • name捕获以空格开头,并以空格作为其第一个字符/。删除其中一个

合并这些改进得到如下表达式:

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