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

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

Подскажите что-нибудь взамен функции Substr и Replacestr... [D6, XP]


vegarulez ©   (2007-01-07 10:07:00) 

Привет всем мастерам!

У меня есть такая вот проблема - нужно в строквой переменной заменить символ или последовательность символов.
Допустим '..' на ':'

Найти эти символы '..' можно допустим с помощью pos скопировать текст до них, и после них тоже можно допустим с помощью copy... завести переменную, если они нашлись то 1 если нет то 0, и потом подставить на их позицию ':'
Но это так муторно получается... и код кривой и громоздкий и трудно читабельный.

Вопрос, есть ли какая-нибудь аналогия функции substr и replacestr?
Чтобы грубо говоря в одну строку кода замену произвести...

Или подскажите как данную замену произвести не так громоздко.


X9   (2007-01-08 16:59:00) [1]

> [16] Anatoly Podgoretsky ©   (07.01.07 21:37)
> О какой оптимальности вообще может идти речь, если она не
> делает заявленого.

Это был лишь пример для замены одного символа на другой.
Замена подстрок мной не предполагалась, IMHO реализовать её весьма несложно.

Я лишь пытался показать напрвление движения :)


Loginov Dmitry   (2007-01-08 00:28:00) [2]

> function FastReplace(Source: string;
> OldChar,NewChar: Char): string;


Еще Const перед Source поставь (или PChar используй) - еще раза в 2 ускоришь.
Только далеко не всегда есть смысл от подобных ускорений.


Anatoly Podgoretsky   (2007-01-07 21:37:00) [3]

> X9  (07.01.2007 19:20:15)  [15]

О какой оптимальности вообще может идти речь, если она не делает заявленого.


X9   (2007-01-07 19:20:00) [4]

Только что проверил, замена сиволов в цикле работает в сотни (если не тысячи раз быстрее), чем StringReplace.

Вот простенькая функция, которая выполняет замену:
function FastReplace(Source: string;
 OldChar,NewChar: Char): string;
var
 I, L: Cardinal;
begin
 Result := '';
 L := Length(Source);
 if L = 0 then
   Exit;
 SetLength(Result, L);
 for I := 1 to L do
   if Source[I] = OldChar then
     Result[I] := NewChar
   else
     Result[I] := Source[I];
end;


Несмотря на неоптимальность приведённого кода, разница более чем очевидна.


X9   (2007-01-07 18:40:00) [5]

> [13] vegarulez ©   (07.01.07 18:31)
> просто
> символы .. и  :  встречаются в строках разной длинны и на
> разных позициях.

Не в этом дело.
Просто, если необходимо заменять лишь один символ другим символом, то вариант с "ручной" заменой в цикле повысит производительнось данной операции, без необходимости выделения памяти во времявыполнения этого цикла.


vegarulez   (2007-01-07 18:31:00) [6]

просто
символы .. и  :  встречаются в строках разной длинны и на разных позициях.
Поэтому StringReplace - то что я искал...


Рамиль   (2007-01-07 16:10:00) [7]

В крайнем случае можно по мере надобности блоками.


Рамиль   (2007-01-07 16:09:00) [8]

Примерно, зависит от задачи. Если .. на : то однозначно хватит длины исходной строки.


try   (2007-01-07 15:57:00) [9]


> А я разве говрил вызывать SetLength на каждую итерацию?
> Она вызывается один раз перед циклом.


Как ты определил истинную длину результирующей строки, ничего не делая, никаких циклов?


Рамиль   (2007-01-07 15:48:00) [10]


> try   (07.01.07 15:34) [8]

А я разве говрил вызывать SetLength на каждую итерацию? Она вызывается один раз перед циклом.


try   (2007-01-07 15:34:00) [11]


> Рамиль ©   (07.01.07 15:30) [7]


А что по твоему происходит при вызове SetLength(s,x), где x больше текущей длины строки s?


Рамиль   (2007-01-07 15:30:00) [12]


> От чего?

"От постоянного дёргания VMM на предмет запроса и перераспределения памяти."


try   (2007-01-07 15:27:00) [13]


> SetLength спасет отца русской демократии.


От чего?


Рамиль   (2007-01-07 15:09:00) [14]


> Это не будет быстрее из-за постоянного дёргания VMM на предмет
> запроса и перераспределения памяти.

SetLength спасет отца русской демократии.


try   (2007-01-07 14:34:00) [15]


> Рамиль ©   (07.01.07 14:00) [3]


Это не будет быстрее из-за постоянного дёргания VMM на предмет запроса и перераспределения памяти.


Рамиль   (2007-01-07 14:00:00) [16]


> Допустим '..' на ':'

Для такого случая я бы не советовал StringReplace - жутко медленно. Лучше пройтись в цикле копируя в другую строку.


X9   (2007-01-07 10:59:00) [17]

Конкретно для вашего случая:
S := StringReplace(S, '..', '.', [rfReplaceAll])

где S - строковая переменная, в содержимом которой необходимо произвести замену.


Loginov Dmitry   (2007-01-07 10:24:00) [18]

SysUtils.StringReplace()


Наверх

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