![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подскажите что-нибудь взамен функции 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()