Форум: "Начинающим";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];
ВнизПодскажите что-нибудь взамен функции Substr и Replacestr... Найти похожие ветки
← →
vegarulez © (2007-01-07 10:07) [0]Привет всем мастерам!
У меня есть такая вот проблема - нужно в строквой переменной заменить символ или последовательность символов.
Допустим ".." на ":"
Найти эти символы ".." можно допустим с помощью pos скопировать текст до них, и после них тоже можно допустим с помощью copy... завести переменную, если они нашлись то 1 если нет то 0, и потом подставить на их позицию ":"
Но это так муторно получается... и код кривой и громоздкий и трудно читабельный.
Вопрос, есть ли какая-нибудь аналогия функции substr и replacestr?
Чтобы грубо говоря в одну строку кода замену произвести...
Или подскажите как данную замену произвести не так громоздко.
← →
Loginov Dmitry © (2007-01-07 10:24) [1]SysUtils.StringReplace()
← →
X9 © (2007-01-07 10:59) [2]Конкретно для вашего случая:
S := StringReplace(S, "..", ".", [rfReplaceAll])
где S - строковая переменная, в содержимом которой необходимо произвести замену.
← →
Рамиль © (2007-01-07 14:00) [3]
> Допустим ".." на ":"
Для такого случая я бы не советовал StringReplace - жутко медленно. Лучше пройтись в цикле копируя в другую строку.
← →
try (2007-01-07 14:34) [4]
> Рамиль © (07.01.07 14:00) [3]
Это не будет быстрее из-за постоянного дёргания VMM на предмет запроса и перераспределения памяти.
← →
Рамиль © (2007-01-07 15:09) [5]
> Это не будет быстрее из-за постоянного дёргания VMM на предмет
> запроса и перераспределения памяти.
SetLength спасет отца русской демократии.
← →
try (2007-01-07 15:27) [6]
> SetLength спасет отца русской демократии.
От чего?
← →
Рамиль © (2007-01-07 15:30) [7]
> От чего?
"От постоянного дёргания VMM на предмет запроса и перераспределения памяти."
← →
try (2007-01-07 15:34) [8]
> Рамиль © (07.01.07 15:30) [7]
А что по твоему происходит при вызове SetLength(s,x), где x больше текущей длины строки s?
← →
Рамиль © (2007-01-07 15:48) [9]
> try (07.01.07 15:34) [8]
А я разве говрил вызывать SetLength на каждую итерацию? Она вызывается один раз перед циклом.
← →
try (2007-01-07 15:57) [10]
> А я разве говрил вызывать SetLength на каждую итерацию?
> Она вызывается один раз перед циклом.
Как ты определил истинную длину результирующей строки, ничего не делая, никаких циклов?
← →
Рамиль © (2007-01-07 16:09) [11]Примерно, зависит от задачи. Если .. на : то однозначно хватит длины исходной строки.
← →
Рамиль © (2007-01-07 16:10) [12]В крайнем случае можно по мере надобности блоками.
← →
vegarulez © (2007-01-07 18:31) [13]просто
символы .. и : встречаются в строках разной длинны и на разных позициях.
Поэтому StringReplace - то что я искал...
← →
X9 © (2007-01-07 18:40) [14]> [13] vegarulez © (07.01.07 18:31)
> просто
> символы .. и : встречаются в строках разной длинны и на
> разных позициях.
Не в этом дело.
Просто, если необходимо заменять лишь один символ другим символом, то вариант с "ручной" заменой в цикле повысит производительнось данной операции, без необходимости выделения памяти во время выполнения этого цикла.
← →
X9 © (2007-01-07 19:20) [15]Только что проверил, замена сиволов в цикле работает в сотни (если не тысячи раз быстрее), чем 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;
Несмотря на неоптимальность приведённого кода, разница более чем очевидна.
← →
Anatoly Podgoretsky © (2007-01-07 21:37) [16]> X9 (07.01.2007 19:20:15) [15]
О какой оптимальности вообще может идти речь, если она не делает заявленого.
← →
Loginov Dmitry © (2007-01-08 00:28) [17]> function FastReplace(Source: string;
> OldChar,NewChar: Char): string;
Еще Const перед Source поставь (или PChar используй) - еще раза в 2 ускоришь.
Только далеко не всегда есть смысл от подобных ускорений.
← →
X9 © (2007-01-08 16:59) [18]> [16] Anatoly Podgoretsky © (07.01.07 21:37)
> О какой оптимальности вообще может идти речь, если она не
> делает заявленого.
Это был лишь пример для замены одного символа на другой.
Замена подстрок мной не предполагалась, IMHO реализовать её весьма несложно.
Я лишь пытался показать напрвление движения :)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.059 c