Regex: сопоставление, разбор FTP-ответа на запрос

Вот что я пытаюсь сделать:

Я хотел иметь некоторую функциональность FTP в одном из моих приложений (это только для меня, а не для бизнес-приложения или чего-то подобного), и, поскольку я не хотел писать весь этот код FTP-запроса/ответа для себя, я (будучи ленивым я человек) поищите в Интернете оболочку FTP.
Я нашел эта DLL.

Это все очень здорово, работает как шарм. За исключением одного: когда я запрашиваю LastWriteTime определенного файла НА FTP-сервере, 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 написать мне ParsingFormat, который сможет проанализировать вышеуказанный ответ FTP?


person Qqbt    schedule 12.06.2012    source источник
comment
Этот запрос разделен табуляцией? Кажется странным, что вы используете для этого регулярное выражение, по крайней мере, без предварительного разделения на вкладки или что-то в этом роде. Запрос имеет очень обычный формат; вы, вероятно, могли бы сделать много тяжелой работы с помощью старых простых строковых функций.   -  person Justin Morgan    schedule 12.06.2012
comment
@Justin Да, вот в чем проблема: вы видите дату возврата сервера? 11 июня 03:44, после того, как я разобрал ответы: _fileDateTime = Date.Parse(m.Groups(timestamp).Value) это испортило, почему? потому что Date.Parse() не может анализировать такой формат даты, кажется странным, что FTP не возвращает год, но что угодно   -  person Qqbt    schedule 12.06.2012
comment
@Justin, на этом этапе должен помочь пользовательский форматировщик даты.   -  person Qqbt    schedule 12.06.2012


Ответы (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"
> 

Я думаю, что куча регулярных выражений в порядке. Возможно, вам нужно искать проблему в другом месте.

person sarnold    schedule 12.06.2012