2012-04-20 3 views
2

FTP 서버에서 파일을 다운로드하고 있습니다. 일부 파일 이름에는 공백이 있지만 RegEx는이를 인식하지 못합니다.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

, 당신은 당신이 원하는 결과를 얻을 수있는 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); 

당신이 정말로 파일 이름 재 조립하려면, 이런 식으로 뭔가를 할 수있는 정규식을 사용하려면 : 당신은 상단에 using System.Linq;을 필요

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

당신의 암호. 그러나 파일 이름은 원본 파일의 근사치 일뿐입니다. 여러 개의 연속 된 공백 또는 탭 문자가 단일 공백으로 대체되었습니다. 패턴이 일치하는 경우

8

.NET Framework에서 string.Split() 방법을 사용하고 최대 분할 수를 지정할 수 있습니다.

이렇게하면 마지막 부분 (파일 이름)이 개별 부분으로 분할되지 않습니다.

편집 :

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

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

@JasonDown, 편집을 확인하십시오. –

+0

@ L.B : 죄송합니다. 너무 성급하고 시험도 없습니다. –

+0

좋아, 나는 그것을 테스트하고 주어진 예제에서 작동하는 코드를 추가했다. – BergmannF

1

은 BTW 당신은 ​​/ 접착제을하려고 n 번째가 시작하는 모든 단어를 가입 할 수 하지만 당신에 대한 지식은 어떻게 해결할 수 있습니다.

+1

-1 두 개의 공백이있는 파일 이름은 무엇입니까? –

+0

@ agent-j : 당신은 그들을 모두 접착제로 붙일 것입니다, 그렇지 않습니까? – abatishchev

+0

파일 이름이 항상 동일한 형식이라고 가정합니다. – Xaisoft

4

캡처 그룹이이를 쉽게 만듭니다. 대신 Regex.Split의 사항 String.split 방법을 사용한다면

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 

*/