是否有正则表达式来解析FTP目录列表中的值?

是否有正则表达式来解析FTP目录列表中的值?,ftp,Ftp,我正在检索文件列表,但解析器正在破坏其中一个文件。所以我要修改它: 正则表达式: / +/g 以下是它遇到问题的列表: drw-rw---- 2 joeUser dhapache 7 May 18 2011 Hello World.html 有人用正则表达式解析文件列表吗?另外,假设第9位之后的任何内容都是文件名(您在其中拆分空格?如果是我,我会确保您的返回数据的格式为每个字段填充给定数量的字符,并在需要的地方填充空格。然后我的正则表达式类似于: ^(.*{12})(.*

我正在检索文件列表,但解析器正在破坏其中一个文件。所以我要修改它:

正则表达式:

/ +/g
以下是它遇到问题的列表:

drw-rw----   2 joeUser dhapache        7 May 18  2011 Hello World.html

有人用正则表达式解析文件列表吗?另外,假设第9位之后的任何内容都是文件名(您在其中拆分空格?

如果是我,我会确保您的返回数据的格式为每个字段填充给定数量的字符,并在需要的地方填充空格。然后我的正则表达式类似于:

^(.*{12})(.*{3})(.*{20})(.*{20})(.*{3})(.*{12})(.*{30})
其中:

\1 = permissions
[...]
\6 = date
\7 = filename
获得每个匹配/组的值后,修剪结果数据


有意义吗?

如果可能,使用固定格式的
MLSD
FTP命令,如:

type=file;modify=20150803062903;size=1410887680; filename.avi

仅在不支持该命令的服务器(如IIS)的最后手段时才使用
LIST
命令

如果您只需要文件名,请使用
NLIST
命令。所有服务器都支持该命令,并且它只生成文件名,因此不需要解析


LIST
命令没有定义格式。因此,假设任何内容都不安全

特别是IIS使用完全不同的格式:

02-11-15  03:05PM           1410887680 movie.avi
即使对于使用类Unix格式的服务器,格式也会因文件的年代而异。如果文件足够新,则其时间格式如下:

-rw-r--r-- 1 ftp ftp             11 Sep 09 16:00 new_file.txt
如果用户名太长,用户列和组列混合在一起也很常见。

我使用这个正则表达式:

^([\-ld])([\-rwxs]{9})\s+(\d+)\s+(\w+)\s+(\w+)\s+(\d+)\s+(\w{3}\s+\d{1,2}\s+(?:\d{1,2}:\d{1,2}|\d{4}))\s+(.+)$
我在DART(在regex的开头添加r)和JS上都进行了测试,效果很好。 结果如下:

您可以这样迭代:

//code in dart
String s = "drw-rw----  2 owner group 7  May 12 11:30 index.html";

Iterable<Match> matches = regExp.allMatches(s);
for (Match match in matches) {
  print("${match.group(1)}\n");//type file or dir
  print("${match.group(2)}\n");//permission
  print("${match.group(3)}\n");//nb files
  print("${match.group(4)}\n");//owner
  print("${match.group(5)}\n");//group
  print("${match.group(6)}\n");//size
  print("${match.group(7)}\n");//date
  print("${match.group(8)}\n");//file/dir name
}
//省道中的代码
String s=“drw rw----2所有者组7 May 12 11:30 index.html”;
Iterable matches=regExp.allMatches;
for(匹配中的匹配){
打印(${match.group(1)}\n”);//键入文件或目录
打印(${match.group(2)}\n”);//权限
打印(“${match.group(3)}\n”);//nb文件
打印(${match.group(4)}\n”);//所有者
打印(${match.group(5)}\n”);//组
打印(${match.group(6)}\n”);//大小
打印(${match.group(7)}\n”);//日期
打印(${match.group(8)}\n”);//文件/目录名
}

不幸的是,我无法控制服务器返回的内容。这是一个大型应用程序中的小型集成FTP模块,用户可以使用自己的服务器。换句话说,检查返回数据是否格式化为使用空格填充值,以便重要数据位于每行相同的字符计数:)