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