【问题标题】:Regex: Matching,parsing an FTP response to a request正则表达式:匹配、解析对请求的 FTP 响应
【发布时间】:2012-06-12 00:03:59
【问题描述】:

这是我想要做的:

我想在我的一个应用程序中拥有一些 FTP 功能(这仅适用于我自己,而不是业务应用程序等),因为我不想为自己编写所有 FTP 请求/响应代码,所以我(我是个懒人)在互联网上搜索 FTP 包装器。
我找到了this DLL

这一切都非常棒,就像一个魅力。除了一件事:当我在 FTP 服务器上请求特定文件的 LastWriteTime 时,DLL 给了我奇怪的日期(即打印出虚构的日期)。我已经能够找到问题所在。每当您向 FTP 服务器发送请求时,它都会返回一个单行响应,该响应具有非常特殊的格式。现在我已经能够收集到,这种格式对于大多数服务器来说都是不同的,我的包装 DLL 带有 6 种预定义的响应格式,但我的 FTP 服务器发回了第 7 种格式。以下是对请求和 REGEX 格式的响应:

-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 专业人士给我写一个能够解析上述 FTP 响应的 ParsingFormat 吗?

【问题讨论】:

  • 该请求是制表符分隔的吗?您为此使用正则表达式似乎很奇怪,至少没有首先拆分选项卡或其他内容。该请求采用非常常规的格式;您可能可以使用普通的旧字符串函数完成很多繁重的工作。
  • @Justin 好吧,这就是问题所在:您看到服务器返回的日期了吗? Jun 11 03:44 ,在我解析响应之后: _fileDateTime = Date.Parse(m.Groups("timestamp").Value) 这搞砸了,为什么?因为 Date.Parse() 无法解析这种日期格式,所以 FTP 不返回年份似乎很奇怪,但无论如何
  • @Justin 自定义日期格式化程序此时应该可以解决问题

标签: regex parsing ftp ftpwebrequest


【解决方案1】:

第四种格式的手动检查和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"
> 

我觉得一堆正则表达式没问题。也许您需要在其他地方寻找问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    相关资源
    最近更新 更多