2012-04-20 10 views
2

FTPサーバーからファイルをダウンロードしています。いくつかのファイル名にスペースが含まれていますが、私の正規表現はこれを認識しません。String.Split with FTP file

例:

-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

の外に抽出しません。 –

+0

すべてのスペースを削除しますか? – Likurg

+0

ReGexではなくRegExであるべきですか? – phoog

答えて

3

あなたの代わりにRegex.Splitののstring.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;が必要になりますコード。しかし、ファイル名は元のファイルの近似値にすぎません。複数の連続したスペースまたはタブ文字が1つのスペースに置き換えられました。パターンが一致している場合

8

.NET Frameworkからstring.Split()メソッドを使用し、分割の最大数を指定することができます。

このようにして、最後の部分(ファイル名)は別々の部分に分割されません。

EDIT:コード

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); 
+0

@JasonDown、編集内容を確認してください。 –

+0

@ L.B:おっと...あまりにも急いで、テストはありません。 –

+0

私はちょうどそれをテストし、与えられた例のために働くコードを追加しました。 – BergmannF

1

ところで、あなたが参加する/すべての単語n番目の開始接着することを試みることがあります。実はそれはSplit()の不適切な使用法にちょうど回避策だ

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

を、あなたが知っているので、どのようにそれを修正することができます。

+1

-1 2つのスペースを持つファイル名はどうですか? –

+0

@ agent-j:あなたはそれらをすべて接着するでしょうか? – abatishchev

+0

これは、ファイル名が常に同じ形式であることを前提としています。 – Xaisoft

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; 
+1

Regex.Match(dFile、@(\ S + \ s +){4} +(? \ S +)\ s +(? \ S +)\ s +(? \ S +)\ s + +) ");'? – Olly

+0

@Olly、nice one! –

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 

*/