我有一个用于从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 :(得分: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上测试过。 我不认为你在这个具体的例子中需要^和$。