Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Как заменить I-ю подстроку строки?


Автор: Kbl4AH 19.1.2009, 11:00
Здравствуйте.
САБЖ.
Делаю так:
Код

var
  S, SS: String;
  Pos, Count: Integer;
begin
  Delete(S, Pos, Count);
  Insert(SS, S, Pos);
end;

Можно ли сделать короче?

Автор: Alexeis 19.1.2009, 11:11
StringReplace ?

Автор: Kbl4AH 19.1.2009, 11:25
Цитата(Alexeis @  19.1.2009,  11:11 Найти цитируемый пост)
StringReplace ?

Не пойдет - *заменяет первое или все вхождения*... а надо I-е.

Автор: Kbl4AH 19.1.2009, 11:50
В общем, тупой я вопрос задал smile 

Автор: Данкинг 19.1.2009, 12:09
Цитата(Kbl4AH @  19.1.2009,  11:00 Найти цитируемый пост)
Можно ли сделать короче? 

А зачем? Вроде и так код небольшой и ИМХО оптимальный всё же. smile 

Автор: Alexeis 19.1.2009, 12:12
Цитата(Kbl4AH @  19.1.2009,  10:25 Найти цитируемый пост)

Не пойдет - *заменяет первое или все вхождения*... а надо I-е. 

  Так это ж от параметров зависит, не поставишь ReplaceAll будет только первое вхождение. В делфи очень богатый набор функций для работы со строками, так что икать простые решения нужно.

Автор: Kbl4AH 19.1.2009, 12:19
Цитата(Alexeis @  19.1.2009,  12:12 Найти цитируемый пост)
Так это ж от параметров зависит, не поставишь ReplaceAll будет только первое вхождение. В делфи очень богатый набор функций для работы со строками, так что икать простые решения нужно.

Я понимаю... но мне нужно не все и не 1-е...
есть строка вида 'xxx-xxx-xxx-xx'
а мне нужно вид 'xxx-xxx-xxx xx'
вот я и спросил, как красивее сделать... но щас мне кажется, что не стоило такие глупости спрашивать... подумаешь, что 2-мя процедурами пользуюсь... нормально ведь это... можно, конечно прикрутить LastDelimiter(), но это ни к чему...

Добавлено через 47 секунд
Цитата(Данкинг @  19.1.2009,  12:09 Найти цитируемый пост)
А зачем? Вроде и так код небольшой и ИМХО оптимальный всё же.

согласен)

Автор: Matematik 22.1.2009, 00:07
Примерно так
Код

uses StrUtils;
ReplaceI(const AStr,AOldSubStr,ANewSubStr:AnsiString; AIdx:Integer):AnsiString;
begin
  p := 0;
  k := 0;
  Result := AStr;
  repeat
    Inc(k);
    p := StrUtils.PosEx(AOldSubStr, Result, p+1);
    if (AIdx=k) and (p<>0) then
    begin
      Delete(Result, p, Length(AOldSubStr));
      Insert(ANewSubStr, Result, p);
      break;
    end;    
  until p=0;
end



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)