2014-05-15 32 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。 我不认为你需要^和$在这个具体的例子。

相关问题