我正在从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设置为字符串的其余部分?
答案 0 :(得分:8)
您可以使用.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);
答案 1 :(得分:4)
捕获小组可以轻松完成。
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;
答案 2 :(得分:3)
如果您使用String.Split方法而不是Regex.Split,则可以使用String.Split Method (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;
。但是,文件名只是原始文件的近似值。多个连续的空格或制表符将被替换为单个空格。
答案 3 :(得分:1)
顺便说一句,你可能会尝试粘合/加入从第n个开始的所有单词:
string fileName = String.Join("", splitDownloadFile.Skip(7)); // if file name starts from 8th segment
实际上这只是对Split()
使用不当的一种解决方法,但对于你的知识,你如何解决这个问题。
答案 4 :(得分:1)
如果模式一致,请不要拆分,而是将其放入并从指定的捕获组中提取
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
*/