正则表达式拆分一个字符串,但不拆分另一个字符串

时间:2014-05-15 09:44:21

标签: c# regex split

我有一个用于从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);

3 个答案:

答案 0 :(得分:1)

问题似乎在最后:\s*$

正则表达式的早期部分,即

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

将文件夹与&#34; new&#34;匹配和&#34; TONY&#34;

请参阅demo

但之后会有文字,\s*$与该文字不匹配,因为它只允许空格直到行尾。

答案 1 :(得分:1)

我不确定使用split方法是不错的方法,我建议你使用match方法和命名的capture,但所有的目录列表都是输入字符串:

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
}

(注意:我已经尝试了解文件名/目录名的Microsoft规则,但我不是100%确定,随时可以改进这些字符类)

如果您需要确保所有行都是连续的(当您使用split方法时就是这种情况),您可以在模式的开头添加\G\n?最后(在美元之后)。

最后一个字符类[^\S\n]*可能会替换为\r?(我无法测试,我不会使用Windows)和[ \t] {{1}或[ ](我让你测试一下)。

答案 2 :(得分:0)

正确的正则表达式是

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

你必须在最后一部分捕获\ s以避免分裂你的字符串。

RegexHero上测试过。 我不认为你在这个具体的例子中需要^和$。