![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Функция, вырезающая строку между двумя разделителями
Piter © (2005-08-19 21:28:00)Ищу функцию, в которую передается 3 параметра: исходная строка и два разделителя.
Результатом является строка, находящяяся между этими двумя разделителями в исходной строке.
Ну хотелось бы как можно быстрее :)
прототип:
function CutString(Src, BeginSeparator, EndSeparatpr: string): string
Примеры работы:
CutString('abcdefg', 'ab', 'ef') = 'cd'
CutString('bbvatzq', 'a', 'b') = ''
Piter (2005-08-20 12:00:00) [41]А у кого по сабжу соображения будут? :)
OldNaum (2005-08-20 03:00:00) [42]GuAV © (19.08.05 23:07) [7]
Спасибо за сайтец. Очень интересная "кладовая" ) Никогда не забуду длиннющие топики, где Вы, Defunct (если не ошибаюсь) и многие другие "ускоряли" Pos.
Piter (2005-08-19 23:16:00) [43]Piter © (19.08.05 23:16) [8]
PosEx_Sha_IA32_3_a
это самый быстрый пока аналог PosEx
Piter (2005-08-19 23:16:00) [44]GuAV © (19.08.05 23:07) [7]
переделать PosJOH_MMX_a в PosEx
ну вот, только я переделал и захотел запостить, а ты уже предложил :)
Итак, мой вариант теперь таков:
function CuteString(BeginSeparator:string; EndSeparator:string; var s:string):string;
var i, i2:integer;
begin
Result := '';
if BeginSeparator = '' then
i := 1
else
i := PosEx_Sha_IA32_3_a(BeginSeparator, s);
if i > 0 then
begin
inc(i, Length(BeginSeparator) );
if EndSeparator = '' then
i2 := Length(s) + 1
else
i2 := PosEx_Sha_IA32_3_a( EndSeparator, s, i);
if i2 > i then
Result := Copy(s, i, i2 - i);
end;
end;
GuAV (2005-08-19 23:07:00) [45]Piter © (19.08.05 21:41) [4]
> substr:=copy(s,i,length(s)-i+1);
> i2:=PosJOH_MMX_a(EndSeparator,SubStr);
ИМХО это плохо тем, что создаётся лишняя строка. Причём дляEndSeparator = ''она уже результат, фигли ты ещё делаешь, а дляEndSeparator <> ''неоправданные затраты, лучше искать конец через PosEx. Попробуй переделать PosJOH_MMX_a в PosEx ;)
Кстати, в ММХ уже другой победитель :)
http://dennishomepage.gugs-cats.dk/PosChallenge.htm
Piter (2005-08-19 22:16:00) [46]Leonid Troyanovsky © (19.08.05 21:59) [5]
Т.е., ты подозреваешь, что нас в уикенд делать оное не ломает?
да я же говорю о том, что есть стандартное решение. Может у кого есть - поделится тогда
А функцию я делал сам - поэтому уверен, что можно куда лучше :)
Тем более, что мы даже не знаем кто такой PosJOH_MMX_a.
ну это аналог POS, только более быстрый, взял с какого-то сайта, где проводились соревнования по этому делу.
Leonid Troyanovsky (2005-08-19 21:59:00) [47]
> Piter © (19.08.05 21:41) [4]
> она рабочая... только мне ее сейчас даже анализировать влом
> :)
Т.е., ты подозреваешь, что нас в уикенд делать оное не ломает?
Тем более, что мы даже не знаем кто такой PosJOH_MMX_a.
--
Regards, LVT.
Piter (2005-08-19 21:41:00) [48]Явот где-то нашел в своих архивах функцию эту:
function CuteString(BeginSeparator:string; EndSeparator:string; s:string):string;
var i, i2:integer;
substr:string;
begin
result:='';
if BeginSeparator='' then
i:=1
else
i:= PosJOH_MMX_a(BeginSeparator, s);
if i<>0 then
begin
inc(i, Length(BeginSeparator));
substr:=copy(s,i,length(s)-i+1);
if EndSeparator='' then
i2:=length(substr)+1
else
i2:=PosJOH_MMX_a(EndSeparator,SubStr);
inc(i2,i-1);
if i2>i then
Result:=Copy(s,i,i2-i);
end;
end;
она рабочая... только мне ее сейчас даже анализировать влом :)
Возможно, есть достаточно стандартные решения?
Piter (2005-08-19 21:35:00) [49]Джо © (19.08.05 21:30) [1]
требуется быстрый вариант, наверняка есть уже готовые функции... не хочу изобретать медленный велосипед.
Piter (2005-08-19 21:34:00) [50]Еще пример:
CutString('bbvatzq', 'b', 'a') = 'bv'
Джо (2005-08-19 21:30:00) [51]А что там сложного? Обычный Pos + Copy. Или, если на то пошло, for := 1 to Length...