Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.044 c
2-1168169514
mike-d
2007-01-07 14:31
2007.01.28
Проверка имени создаваемого файла


2-1168535155
DevilDevil
2007-01-11 20:05
2007.01.28
ClientRect


2-1168433997
NovaC
2007-01-10 15:59
2007.01.28
WinToDos & CopyFile


2-1168103202
CoolLamer
2007-01-06 20:06
2007.01.28
А как передать данные из ОДНОЙ процедуры в ДРУГУЮ?


11-1145617791
netsend
2006-04-21 15:09
2007.01.28
KOL plugins





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский