Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Функция, вырезающая строку между двумя разделителями


Страницы:   1 2 3

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...


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо