使用正则表达式从 ListDirectoryDetails 中解析文件名
Parsing file name out of ListDirectoryDetails with Regex
我正在尝试解析来自 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> .*)
我需要更强大的正则表达式。也许只有文件名匹配正则表达式应该更好。
如何只用正则表达式匹配文件名?
要仅解析文件名,只需获取第 9 个标记:
^(?:[^ ]+ +){8}(.*)$
Regex regex = new Regex("^(?:[^ ]+ +){8}(.*)$");
Match match = regex.Match(line);
string filename = match.Groups[1].Value;
尽管如此简单的解析,您实际上可以通过 space 将行拆分为标记。您不需要正则表达式。
string[] tokens = line.Split(new[] { ' ' }, 9, StringSplitOptions.RemoveEmptyEntries);
string filename = tokens[8];
但是如果您只需要一个文件名,请不要首先使用 ListDirectoryDetails
。使用ListDirectory
。它 returns 只有文件名。
如果需要解析文件属性,请使用支持FTP MLSD
命令的FTP客户端。 FtpWebRequest
不支持这个。
问题中的正则表达式是:正则表达式是:
(?<permissions>[drwx\-]+( (?<userandgroup>[A-Za-z]+ [A-Za-z]+) (?<size>\d+) (?<date>[A-Za-z]+ [\d:]+) (?<name> .*)
这个表达式有几个问题。
- 第二个'('应该是')'。
- link 计数丢失。在前两个捕获组之间添加
(\d+)
(加一个 space)。
- 只允许在
userandgroup
和 size
捕获之间允许单个 space。在(?<size>\d+)
. 前加一个+
- 日期不匹配。将
date
捕获中的单个 space 替换为 [\d]+
(两边必须有一个 space)。
name
捕获前面有一个 space,第一个字符是 space/。删除其中一个。
合并这些改进得到表达式:
(?<permissions>[drwx\-]+) (\d+) (?<userandgroup>[A-Za-z]+ [A-Za-z]+) +(?<size>\d+) (?<date>[A-Za-z]+ [\d]+ [\d:]+) (?<name>.*)
我正在尝试解析来自 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> .*)
我需要更强大的正则表达式。也许只有文件名匹配正则表达式应该更好。
如何只用正则表达式匹配文件名?
要仅解析文件名,只需获取第 9 个标记:
^(?:[^ ]+ +){8}(.*)$
Regex regex = new Regex("^(?:[^ ]+ +){8}(.*)$");
Match match = regex.Match(line);
string filename = match.Groups[1].Value;
尽管如此简单的解析,您实际上可以通过 space 将行拆分为标记。您不需要正则表达式。
string[] tokens = line.Split(new[] { ' ' }, 9, StringSplitOptions.RemoveEmptyEntries);
string filename = tokens[8];
但是如果您只需要一个文件名,请不要首先使用 ListDirectoryDetails
。使用ListDirectory
。它 returns 只有文件名。
如果需要解析文件属性,请使用支持FTP MLSD
命令的FTP客户端。 FtpWebRequest
不支持这个。
问题中的正则表达式是:正则表达式是:
(?<permissions>[drwx\-]+( (?<userandgroup>[A-Za-z]+ [A-Za-z]+) (?<size>\d+) (?<date>[A-Za-z]+ [\d:]+) (?<name> .*)
这个表达式有几个问题。
- 第二个'('应该是')'。
- link 计数丢失。在前两个捕获组之间添加
(\d+)
(加一个 space)。 - 只允许在
userandgroup
和size
捕获之间允许单个 space。在(?<size>\d+)
. 前加一个 - 日期不匹配。将
date
捕获中的单个 space 替换为[\d]+
(两边必须有一个 space)。 name
捕获前面有一个 space,第一个字符是 space/。删除其中一个。
+
合并这些改进得到表达式:
(?<permissions>[drwx\-]+) (\d+) (?<userandgroup>[A-Za-z]+ [A-Za-z]+) +(?<size>\d+) (?<date>[A-Za-z]+ [\d]+ [\d:]+) (?<name>.*)