Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.28;
Скачать: CL | DM;

Вниз

Подскажите что-нибудь взамен функции 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.055 c
15-1168278548
Sergey Masloff
2007-01-08 20:49
2007.01.28
Книжки которые можно читать


15-1166237552
for
2006-12-16 05:52
2007.01.28
Сишные циклы FOR в Паскаль не переводятся?


1-1165487765
sdram
2006-12-07 13:36
2007.01.28
С обьявлениями хомуты


2-1168007660
Цукор5
2007-01-05 17:34
2007.01.28
Преобразование... Int64 в строку


15-1167925238
nameless
2007-01-04 18:40
2007.01.28
Почему когда я подключаю USB 1.1 мышь -