字符串.拆分针对 FTP 文件

本文关键字:FTP 文件 拆分 字符串 | 更新日期: 2023-09-27 18:31:57

我正在从FTP服务器下载文件。一些文件名中有空格,但我的正则表达式无法识别这一点。

例:

-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 设置为字符串的其余部分?

字符串.拆分针对 FTP 文件

您可以使用 .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);

如果你真的想使用正则表达式,你可以做这样的事情来重新组装文件名:

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

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

顺便说一句,

您可以尝试粘合/连接所有以n-th开头的单词:

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
*/