繁体   English   中英

String.Split对FTP文件

[英]String.Split against FTP file

我正在从FTP服务器下载文件。 某些文件名中包含空格,但我的RegEx无法识别。

例:

-rw-r--r-- 1 ftp ftp        8613651 Apr 15  2011 Crystal Reports User Guide.pdf

码:

string[] splitDownloadFile = Regex.Split(dFile, @"\s+");
string fMonth = splitDownloadFile[5];
string fDate = splitDownloadFile[6];
string fyear = splitDownloadFile[7];
string fName = splitDownloadFile[8];

是否可以将字符串fName设置为字符串的其余部分?

您可以使用.NET Framework中string.Split()方法并指定最大拆分数。

这样,最后一部分(文件名)不会被拆分成单独的部分。

编辑:代码

string s = "-rw-r--r-- 1 ftp ftp        8613651 Apr 15  2011 Crystal Reports User Guide.pdf";
string[] c = {" ", "\t"};
string[] p = s.Split(c, 9, StringSplitOptions.RemoveEmptyEntries);
string name = p[8];
Console.WriteLine(name);

捕获组使这很容易。

var match = Regex.Match(dFile, @"\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+(?<month>\S+)\s+(?<date>\S+)\s+(?<year>\S+)\s+(?<name>.+)");

string fName = match.Groups["name"].Value;

如果你使用String.Split方法而不是Regex.Split,你可以使用String.Split方法(Char [],Int32)重载,你可以实现你想要的结果。 您需要准确计算出需要满足的空白字符。

就像是:

string test = "-rw-r--r-- 1 ftp ftp        8613651 Apr 15  2011 Crystal Reports User Guide.pdf";
string[] parts = test.Split(new[] { '\t', ' ' }, 9, StringSplitOptions.RemoveEmptyEntries);

如果你真的想使用Regex,你可以这样做来重新组合文件名:

string[] again = Regex.Split(test, "\\s+");
var fname = string.Join(" ", again.Skip(8).ToArray());

您需要using System.Linq; 在代码的顶部。 但是,文件名只是原始文件的近似值。 多个连续的空格或制表符将被替换为单个空格。

顺便说一句,你可能会尝试粘合/加入从第n个开始的所有单词:

string fileName = String.Join("", splitDownloadFile.Skip(7)); // if file name starts from 8th segment

实际上这只是一个解决方法,不正确使用Split() ,但对于你知道如何解决这个问题。

如果模式是一致的,请不要拆分,而是将其放入并从指定的捕获组中提取出来

string data = "-rw-r--r-- 1 ftp ftp        8613651 Apr 15  2011 Crystal Reports User Guide.pdf";

string pattern = @"
^                       # Beginning Anchor
(?<Permissions>[^\s]+)  # Get permissions into named capture
(?:\s+)                 # Match but don't capture space
(?<Count>\d+)
(?:\s+)
(?<Op1>[^\s]+)          # Continue with capturing valued text into named
(?:\s+)                 # captures and matching, but not capturing space which is ignored.
(?<Op2>[^\s]+)
(?:\s+)
(?<Size>[^\s]+)
(?:\s+)
(?<Month>[^\s]+)
(?:\s+)
(?<Day>[^\s]+)
(?:\s+)
(?<Year>[^\s]+)
(?:\s+)
(?<FileName>[^\r\n]+)";

// Ignore option only applies to the pattern so we can comment it.
var mtGroup = Regex.Match(data, pattern, RegexOptions.IgnorePatternWhitespace).Groups;

Console.WriteLine ("In {0} we created {1}", mtGroup["Month"].Value, mtGroup["FileName"].Value);
/* Output

In Apr we created Crystal Reports User Guide.pdf

*/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM