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

C# 正则表达式拆分一个字符串,但不拆分另一个字符串,c#,regex,split,C#,Regex,Split,我有一个用于从Windows服务器拆分FTP目录列表的正则表达式,它将在一种情况下拆分字符串,而不是在另一种情况下拆分字符串。我不是正则表达式专家,不知道是否有人能告诉我为什么其中一个会被拆分,而另一个不会 我希望它拆分字符串,因此我有以下组件: DateTime IsDirectory/IsFile (<DIR> is present or not) Size FileName DateTime IsDirectory/IsFile(是否存在) 大小 文件名 (1)

我有一个用于从Windows服务器拆分FTP目录列表的正则表达式,它将在一种情况下拆分字符串,而不是在另一种情况下拆分字符串。我不是正则表达式专家,不知道是否有人能告诉我为什么其中一个会被拆分,而另一个不会

我希望它拆分字符串,因此我有以下组件:

 DateTime
 IsDirectory/IsFile  (<DIR> is present or not)
 Size
 FileName
DateTime
IsDirectory/IsFile(是否存在)
大小
文件名
(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);
//05-14-14 11:29AM 0 New Text Document.txt(1)
//05-12-1412:17托尼(2)
string directorylisting=“05-14-14 11:29AM 0 New Text Document.txt”;
字符串regex=@“^(\d\d-\d\d-\d\d)\s+(\d\d:\d\d(AM | PM))\s+()?\s+(\d*)\s+([\w\.\u\-]+)\ s*$”;
var split=Regex.split(directorylisting,Regex);

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

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

^(\d\d-\d\d-\d\d)\s+(\d\d:\d\d(AM|PM))\s+(<DIR>)?\s+(\d*)\s+([\w\._\-]+)
^(\d\d-\d\d-\d\d)\s+(\d\d:\d\d(AM | PM))\s+()?\s+(\d*)\s+([\w\.\u\-]+)
将文件夹匹配到“new”和“TONY”


但是后面有文本,
\s*$
将与该文本不匹配,因为它只允许行尾有空格。

正确的正则表达式是

(\d\d-\d\d-\d\d)\s+(\d\d:\d\d(AM|PM))\s+(<DIR>)?\s+(\d*)\s+([\w\._\-]+\s)*
(\d\d-\d\d-\d\d)\s+(\d\d:\d\d(AM | PM))\s+()?\s+(\d*)\s+([\w\.\u\-]+\ s)*
您必须在最后一部分捕获\s以避免拆分字符串

经过测试。
我认为在这个特定的示例中,您不需要“^”和“$”。

我不确定在这里使用split方法是否合适,我建议您使用match方法和命名捕获,但将所有目录列表作为输入字符串:

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
}
字符串模式=@”(?mx)^
(?[0-9]{2}(?:-[0-9]{2}{2})[\t]+
(?[0-9]{2}:[0-9]{2}[AP]M][\t]+
(?:
(?      )
|
(? [0-9]+ )
)[\t]+
(?(isDir)
(?[^*|”“:/\?\u0001-\u001f\n\r]{132768}?)
|
(?[^*|”“:/\?\u0001-\u001f\n\r]{132768}?)
)[^\S\n]*$”;
foreach(在Regex.Matches中匹配m(列表,模式)){
//对于每条线路,您可以测试组isDir,以了解它是否正确
//有没有目录
}
(注意:我试图理解Microsoft关于filename/dirname的规则,但我不是100%确定,请随意改进这些字符类)

如果需要确保所有行都是连续的(使用拆分方法时就是这种情况),可以在图案的开头添加
\G
,在结尾添加
\n?
(美元之后)


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

那么,您的确切拆分标准是什么?如果您解释以下内容,则更容易找到正确的正则表达式:p@Kilazur我更新了我的问题,解决了这个问题,所以现在它将字符串(1)拆分,但是如何防止它将“New Text Document.txt”拆分为“New”和“Text Document.txt”?您只需捕获\s:(\d\d-\d\d-\d\d\d)\s+(\d\d:\d\d(AM | PM))\s+(\s+(\d*)\s+([\w\.\u\-]+\ s)*@TonyTheLion Kilazur所说的话,例如。您有许多选项可以到达字符串的末尾。例如[^\n]*在它看来,您正在创建捕获组(不确定为什么,因为您想拆分?)因此,您必须决定它是否属于我们的括号外。@TonyTheLion我的意思是,如果您只想匹配行,这可以替换整个正则表达式。
^[^\n]*
…但您大概知道目录应该是什么样子(时间戳等)