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?
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"
>
Я думаю, что куча регулярных выражений в порядке. Возможно, вам нужно искать проблему в другом месте.