2012-06-12 42 views
1

這裏就是我想要做的事:正則表達式:匹配,解析FTP響應請求

我什麼有一些FTP功能在我的應用程序之一(這只是我自己,不是一個企業應用或者這樣),因爲我不想爲自己編寫所有的FTP請求/響應代碼,所以我(作爲懶惰的人)在互聯網上搜索FTP包裝器。
我找到了this DLL

這一切都非常棒,就像一個魅力。除了一件事情:當我在FTP服務器上請求特定文件的LastWriteTime時,該DLL給我奇怪的日期(即打印出虛構的日期)。我一直能夠找到問題。無論何時向FTP服務器發送請求,它都會發回一行響應,該響應具有非常特殊的格式。現在我已經能夠收集,這種格式對於大多數服務器是不同的,我的包裝DLL帶有6個預定義的響應格式,但是我的FTP服務器發回了第7個。下面是對請求的響應和正則表達式的格式:

-rw-r--r-- 1 user user   594 Jun 11 03:44 random_log.file 

這裏是我的正則表達式解析格式:

"(?<dir>[\-d])(?<permission>([\-r][\-w][\-xs]){3})\s+\d+\s+\w+\s+\w+\s+(?<size>\d+)\s+(?<timestamp>\w+\s+\d+\s+\d{4})\s+(?<name>.+)", _ 
"(?<dir>[\-d])(?<permission>([\-r][\-w][\-xs]){3})\s+\d+\s+\d+\s+(?<size>\d+)\s+(?<timestamp>\w+\s+\d+\s+\d{4})\s+(?<name>.+)", _ 
"(?<dir>[\-d])(?<permission>([\-r][\-w][\-xs]){3})\s+\d+\s+\d+\s+(?<size>\d+)\s+(?<timestamp>\w+\s+\d+\s+\d{1,2}:\d{2})\s+(?<name>.+)", _ 
"(?<dir>[\-d])(?<permission>([\-r][\-w][\-xs]){3})\s+\d+\s+\w+\s+\w+\s+(?<size>\d+)\s+(?<timestamp>\w+\s+\d+\s+\d{1,2}:\d{2})\s+(?<name>.+)", _ 
"(?<dir>[\-d])(?<permission>([\-r][\-w][\-xs]){3})(\s+)(?<size>(\d+))(\s+)(?<ctbit>(\w+\s\w+))(\s+)(?<size2>(\d+))\s+(?<timestamp>\w+\s+\d+\s+\d{2}:\d{2})\s+(?<name>.+)", _ 
"(?<timestamp>\d{2}\-\d{2}\-\d{2}\s+\d{2}:\d{2}[Aa|Pp][mM])\s+(?<dir>\<\w+\>){0,1}(?<size>\d+){0,1}\s+(?<name>.+)" 

這些非似乎能夠正確地解析日期時間,因爲我不知道如何做到這一點,可以REGEX pro請給我寫一個能解析上面的FTP響應的ParsingFormat?

+0

該請求是製表符分隔的嗎?這似乎很奇怪,你使用正則表達式來做到這一點,至少沒有先在選項卡或其他東西上分割。請求格式非常普遍;用普通的舊字符串函數可能會做很多繁重的工作。 –

+0

@Justin好的,問題在於:你看到服務器返回的日期? Jun 11 03:44,當我解析迴應後: _fileDateTime = Date.Parse(m.Groups(「timestamp」)。Value)這個混亂,爲什麼?因爲Date.Parse()不能解析這種日期格式,似乎奇怪的是,FTP不返回年,但無論如何 – Qqbt

+0

@Justin自定義日期格式化程序應該在這一點上做的伎倆 – Qqbt

回答

2

兩個手工檢查和irb檢查第四格式的顯示,它確實比賽:

> re=/(?<dir>[\-d])(?<permission>([\-r][\-w][\-xs]){3})\s+\d+\s+\w+\s+\w+\s+(?<size>\d+)\s+(?<timestamp>\w+\s+\d+\s+\d{1,2}:\d{2})\s+(?<name>.+)/ 
=> /(?<dir>[\-d])(?<permission>([\-r][\-w][\-xs]){3})\s+\d+\s+\w+\s+\w+\s+(?<size>\d+)\s+(?<timestamp>\w+\s+\d+\s+\d{1,2}:\d{2})\s+(?<name>.+)/ 
> m=re.match("-rw-r--r-- 1 user user   594 Jun 11 03:44 random_log.file") 
=> #<MatchData "-rw-r--r-- 1 user user   594 Jun 11 03:44 random_log.file" dir:"-" permission:"rw-r--r--" size:"594" timestamp:"Jun 11 03:44" name:"random_log.file"> 
> m['dir'] 
=> "-" 
> m['permission'] 
=> "rw-r--r--" 
> m['size'] 
=> "594" 
> m['timestamp'] 
=> "Jun 11 03:44" 
> m['name'] 
=> "random_log.file" 
> 

我認爲,正則表達式的樁都很好。也許你需要尋找其他地方的問題。

+0

好吧,謝謝,我會多看看它。不管怎麼說,還是要謝謝你。 – Qqbt