![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
парсин строки имени файла
DL © (2009-12-23 13:03:00)Имеется список строк формата:
Attach_<ID>_<DateTime>.zip,
например:
'Attach_417_23_12_2009_11_52_31.zip'.
Задача: из строки извлечь ID и DateTime. Вопрос, сообственно, в слдующем: какой подход грамотнее всего использовать при парсинге: RegExp'ы или же простые PosEx, Copy.
Palladin (2009-12-23 20:52:00) [1]
> Так что выбор зависит от задачи
Выбор зависит не от задачи, а от ее условий. Условия описаны ОДНОЗНАЧНЫЕ, алгоритм парсинга ОДНОЗНАЧНЫЙ, без ДВУСМЫСЛЕНОСТЕЙ. Электролампочки и ЛЭП станции тут нет.
TUser (2009-12-23 17:33:00) [2]На правах имхи
> Применение РВ для такой детской задачки подобно стрельбе
> из пушки по воробьям.
Применение электростанции+ЛЭП+лампочки тоже похоже на стрельбу их пушки по воробьям. И в программировании, вроде, очень похоже: например, для реализации массива нужен указатель и индексная арифметка. Но люди создают объекты, которые внутрь себя массив оборачивают. И всякий там TList при создании выделяет себе больше памяти, чем "нужно" и выполняет множество "лишнего" кода. Чисто стрельба из пушки.
Выбор любого инструмента определяется альтернативными издержками. А именно: 1. Насколько долго/трудно его заюзать и отладить. 2. Насколько быстро будет работать (варианты - сколько использует памяти, других ресурсов, насколько точный результат выдаст). Например, все, что угодно можно написать на асме, но долго писать. И в большинстве случаев выигрышь в скорости и в прочем будет не критичным. Ну будет программа записать не 360 Кб, а 1, а оно нафиг не надо. Аналогично и в другую сторону, - искать подстроку регэкспами, гораздо проще Боера-Мура, только тормознутее.
Так что выбор зависит от задачи. Если некое место в программе критично, то надо написать все ручками, гораздо оптимальнее стандартных pos/copy, а если не критично, то надо выбрать то, что проще писать. А последнее, к тому же, от конкретного писателя зависит.
DL (2009-12-23 15:46:00) [3]сделал так:
procedure TForm4.Button1Click(Sender: TObject);
procedure PharsePacketName(const PacketName: string; out ID: Integer;
out Received: TDateTime);
begin
with TStringList.Create do
try
Delimiter := '_';
DelimitedText := PacketName;
ID := StrToIntDef(Strings[1], -1);
Received := EncodeDateTime(
StrToIntDef(Strings[4], -1),
StrToIntDef(Strings[3], -1),
StrToIntDef(Strings[2], -1),
StrToIntDef(Strings[5], -1),
StrToIntDef(Strings[6], -1),
StrToIntDef(Strings[7], -1), 0);
finally
Free;
end;
end;
var
ID: Integer;
Received: TDateTime;
begin
PharsePacketName('attach_417_23_12_2009_13_50_04', ID, Received);
ShowMessageFmt('ID: %d; Received: %s', [ID, DateTimeToStr(Received)]);
end;
Демо (2009-12-23 15:26:00) [4]Судя по формату - достаточно двух функций Copy.
Юрий Зотов (2009-12-23 14:54:00) [5]> какой подход грамотнее всего использовать при
> парсинге: RegExp'ы или же простые PosEx, Copy
Применение РВ для такой детской задачки подобно стрельбе из пушки по воробьям.
> регэкспами проще, конечно.
???????????
Не наоборот?
MBo (2009-12-23 14:07:00) [6]если формат жесткий, то регэкспы - излишество, достаточно разделения строки с помощью TStringList.DelimitedText
DL (2009-12-23 13:34:00) [7]с подходом определился. спасибо. теперь надо бы определиться с библиотекой для работы с regexp'ами. что посоветуете?
RWolf (2009-12-23 13:11:00) [8]регэкспами проще, конечно.
правда, размер программы подрастёт.