2

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 を文字列の残りの部分に設定することは可能ですか?

4

5 に答える 5

8

.NET Frameworkstring.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);
于 2012-04-20T13:44:35.090 に答える
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;
于 2012-04-20T13:53:13.017 に答える
3

Regex.Split の代わりに String.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;コードの先頭にが必要です。ただし、ファイル名は元のファイルの近似値にすぎません。複数の連続するスペースまたはタブ文字は、単一のスペースに置き換えられます。

于 2012-04-20T13:53:15.070 に答える
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

*/
于 2012-04-20T14:07:43.687 に答える
1

ところで、n番目から始まるすべての単語を接着/結合しようとするかもしれません:

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

実際には、これは の不適切な使用に対する回避策にすぎませSplit()んが、ご存知のとおり、それを修正するにはどうすればよいでしょうか。

于 2012-04-20T13:48:18.063 に答える