2014-05-15 30 views
0

我有一個正則表達式用於從Windows Server中分割一個FTP目錄列表,它將在一種情況下拆分字符串,而不是另一種。我不是正則表達式的專家,並想知道是否有人能告訴我爲什麼其中一個會分裂,而另一個不會?正則表達式分割一個字符串,但不是另一個

我想,所以我有以下組件來分割字符串:

DateTime 
IsDirectory/IsFile (<DIR> is present or not) 
Size 
FileName 

(1)將不分割字符串,(2)將被分割

//05-14-14 11:29AM     0 New Text Document.txt (1) 
//05-12-14 12:17PM  <DIR>   TONY (2) 

string directorylisting = "05-14-14 11:29AM     0 New Text Document.txt"; 
string regex = @"^(\d\d-\d\d-\d\d)\s+(\d\d:\d\d(AM|PM))\s+(<DIR>)?\s+(\d*)\s+([\w\._\-]+)\s*$"; 
var split = Regex.Split(directorylisting, regex); 
+0

那麼,你分裂的準確標準是什麼?如果你解釋爲:p – Kilazur

+0

@Kilazur我更新了我的問題 –

回答

1

我不知道,使用split方法是這裏的好辦法,我建議你使用的匹配方法,並命名爲捕獲但所有的目錄列表作爲輸入字符串:

string pattern = @"(?mx)^ 
    (?<date> [0-9]{2}(?:-[0-9]{2}){2}) [ \t]+ 
    (?<time> [0-9]{2}:[0-9]{2}[AP]M ) [ \t]+ 
    (?: 
     (?<isDir> <DIR> ) 
     | 
     (?<filesize> [0-9]+) 
    ) [ \t]+ 
    (?(isDir) 
     (?<dirname> [^<>*|"":/\\?\u0001-\u001f\n\r]{1,32768}?) 
     | 
     (?<filename> [^<>*|"":/\\?\u0001-\u001f\n\r]{1,32768}?) 
    ) [^\S\n]* $"; 

foreach (Match m in Regex.Matches(listing, pattern)) { 
    // for each line you can test the group isDir to know if it is 
    // a directory or not 
} 

(注:我試圖瞭解微軟的文件名/ dirname規則,但我不是100%肯定的,隨時可以改進這些字符類)

如果您需要確保所有行都是連續的(情況如此當你使用split方法時),你可以在pat開始時添加\G燕尾和\n?在最後(美元后)。

的最後一個字符類[^\S\n]*也許可以用\r?更換(我無法測試,我不使用Windows)和[ \t][ ]\t(我讓你測試)。

+0

這工作得很好。非常感謝 :) –

1

問題似乎是在最後:\s*$

正則表達式的早期部分,即

^(\d\d-\d\d-\d\d)\s+(\d\d:\d\d(AM|PM))\s+(<DIR>)?\s+(\d*)\s+([\w\._\-]+) 

的文件夾相匹配,以「新」,「TONY」

demo

但在那之後有文本,因爲它僅允許使用空格,到最後的\s*$不會文本匹配的線。

+0

修復了這個問題,所以現在它分割了字符串(1),但是我怎樣才能防止它分裂「New Text Document.txt「轉換爲」New「和」Text Document.txt「? –

+1

你只需要捕獲\ s:(\ d \ d- \ d \ d- \ d \ d)\ s +(\ d \ d:\ d \ d(AM | PM))\ s +(

)例如,Kilazur說了什麼?\ s +(\ d *)\ s +([\ w \ ._ \ - ] + \ s)* – Kilazur

+1

@TonyTheLion。你有很多選項可以到達字符串的末尾。例如[^ \ n] *如[demo](http:// regex101。com/r/lI3fC0)看起來你正在創建捕獲組(不知道爲什麼,因爲你想拆分?),所以你必須決定是否屬於我們的括號內。 – zx81

0

這樣做的正確的正則表達式是

(\d\d-\d\d-\d\d)\s+(\d\d:\d\d(AM|PM))\s+(<DIR>)?\s+(\d*)\s+([\w\._\-]+\s)* 

你必須捕捉\ S的最後部分,以避免分裂您的字符串。

測試RegexHero。 我不認爲你需要^和$在這個具體的例子。

相關問題