Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.08.2009, 12:25   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию TStringList Замена символа на ряд символов.

Имеется TStringList на 100 строк.
Имеется символ "@", который нужно во всех строках заменить на "001".
Раньше ходил циклом по каждому символу строки, потом Copy выдирал строку до символа и после, между ними вставлял "001". А можно это сделать одним оператором? Или без цикла
Код:
While Pos(List[N],'@')<>0 do
не обойтись?

P.S. На поиск не посылайте, ничего схожего не обнаружил (только 1 на 1, а у меня 1 на 3).
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 23.08.2009, 13:10   #2
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

Попробуй
Код:
StringReplace(SL.Text,  '@',  '001',  [rfReplaceAll]);
тут SL - StringList
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 23.08.2009, 13:22   #3
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Цитата:
На поиск не посылайте, ничего схожего не обнаружил (только 1 на 1, а у меня 1 на 3).
Это не есть правда. Даже чисто по Паскалевски будет работать.
Код:
for i:=length(s) downto 1  do
if s[i]='@' then 
 begin 
   delete(s,i,1);
   insert('001',s,i);
 end;
Но конечно в Делфи нужно писать по Делфийски, как Вам и написали выше.
puporev вне форума Ответить с цитированием
Старый 23.08.2009, 14:05   #4
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

puporev, это опять есть цикл, что не есть хорошо, Kotofff, спасибо, помогло. На будущее тем, кто будет её юзать: это функция, её нужно присваивать.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 23.08.2009, 14:22   #5
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Цитата:
это опять есть цикл, что не есть хорошо,
А Вы почитайте как организована функция StringReplace(SL.Text, '@', '001', [rfReplaceAll]);
Думаете там внутри не цикл?

Вот, если Вам некогда. Это Вы вызываете функцией.
Код:
function StringReplace(const S, OldPattern, NewPattern: string;
  Flags: TReplaceFlags): string;
var
  SearchStr, Patt, NewStr: string;
  Offset: Integer;
begin
  if rfIgnoreCase in Flags then
  begin
    SearchStr := AnsiUpperCase(S);
    Patt := AnsiUpperCase(OldPattern);
  end else
  begin
    SearchStr := S;
    Patt := OldPattern;
  end;
  NewStr := S;
  Result := '';
  while SearchStr <> '' do //отсюда начинается так ненавистный Вам цикл
  begin
    Offset := AnsiPos(Patt, SearchStr);
    if Offset = 0 then
    begin
      Result := Result + NewStr;
      Break;
    end;
    Result := Result + Copy(NewStr, 1, Offset - 1) + NewPattern;
    NewStr := Copy(NewStr, Offset + Length(OldPattern), MaxInt);
    if not (rfReplaceAll in Flags) then
    begin
      Result := Result + NewStr;
      Break;
    end;
    SearchStr := Copy(SearchStr, Offset + Length(Patt), MaxInt);
  end;
end;
А это предложил я.
Код:
for i:=length(s) downto 1  do
if s[i]='@' then 
 begin 
   delete(s,i,1);
   insert('001',s,i);
 end;

Последний раз редактировалось Stilet; 23.03.2010 в 11:19.
puporev вне форума Ответить с цитированием
Старый 23.08.2009, 16:22   #6
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
если Вам некогда
Если я отсутствую 20 минут, это не значит, что я пустил тему в игнор.
Цитата:
А это предложил я.
Да, теперь, после сравнения видно. Хотя, если надо сделать много замен, придется малевать функцию, но все равно спасибо.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 23.08.2009, 16:26   #7
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Цитата:
Хотя, если надо сделать много замен, придется малевать функцию,
Да нет, не надо ничего писать, я просто привел пример того, что если Вы исследуете массив(строку), то без цикла вряд ли обойдетесь. А дельфийские функции переписывать не надо, ими просто надо пользоваться.
puporev вне форума Ответить с цитированием
Старый 23.08.2009, 17:30   #8
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
Да нет, не надо ничего писать
Код:
Procedure RepString(Str, FrstSym, ReplSym:String);
 Var
  I:Integer;
 Begin
  for I:=length(Str) downto 1  do
   if Str[I]=FrstSym then 
    begin 
     delete(Str,I,1);
     insert(ReplSym,S,I);
    end;
 End;
Код:
RepString(S,'A','001');
RepString(S,'B','002');
RepString(S,'G,'##4');
А говорите не надо.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 23.08.2009, 17:59   #9
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

Если интересует скорость - можно попробовать использовать Q_ReplaceStr из модуля QStrings, который я уже давал где-то тут. Там вообще валом функций для работы со строчными данными.
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 23.03.2010, 04:27   #10
Liite
позитиффф
Пользователь
 
Регистрация: 14.11.2008
Сообщений: 34
По умолчанию

всем доброго времени суток, у меня вопрос в продолжение темы, хотя может и не совсем, есть строчка из плэйлиста винампа <#EXTINF:254,дубовыйъ гай - синяя лирика> надо что бы при обнаружении в начали строки этого самого #EXTINF:254 эта строчка убивалась полностью , может кто чем помочь?
Liite вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Замена символа Flippp Общие вопросы C/C++ 20 24.06.2009 17:18
Шифрование, замена символов. foE Общие вопросы Delphi 4 26.05.2009 12:03
Перемещение и замена данных на один ряд выше Khabibula Microsoft Office Access 1 13.08.2008 12:57
Перл. Замена символа \ на символ / Stilet PHP 1 12.04.2008 10:17
Замена символов PAVEL315 Общие вопросы Delphi 1 03.02.2007 21:56