Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 114

/ вопрос решён /

Здравствуйте, уважаемые эксперты!
Каким образом можно осуществить замену одного фрагмента на другой в определённой строке? Например, в большом тексте нужно заменить "123" на "456". Как это проще всего реализовать? И дополнительный вопрос: как осуществить тоже самое, но не обращая внимание на регистр, т.е. и "привет", и "ПРИВЕТ" и "пРиВеТ" должно замениться на "Hello"?
Заранее благодарю за ответы.

Sunshine Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Sunshine (статус: Посетитель)
Вопрос отправлен: 28 августа 2006, 17:48
Состояние вопроса: решён, ответов: 6.

Ответ #1. Отвечает эксперт: Лукьяненко Алексей Валериевич

1 - функция ANSIReplaceStr
2 - функция ANSIReplaceText
Параметры (все строковые):
1 - где искать
2 - что искать
3 - на что заменять
Результат функции - строка с заменами

Ответ отправил: Лукьяненко Алексей Валериевич (статус: 1-ый класс)
Время отправки: 28 августа 2006, 18:17
Оценка за ответ: 5

Комментарий к оценке: Спасибо, как раз то, что нужно. Только вы забыли указать, что данные функции находятся в модуле StrUtils...

Ответ #2. Отвечает эксперт: Geron

Здравствуйте, Sunshine! Сначало мы ищем нужную строку строку: pos(Подстрока,Строка);
Потом мы вырезаем эту строку: delete(Строка, номер символа, с которого начинается удаляемая подстрока, длина удаляемой подстроки);
И вставляем нужную строку(копируем до нужной строки и после нужной строки, склеиваем ''+''+'').

Ответ отправил: Geron (статус: 1-ый класс)
Время отправки: 28 августа 2006, 18:28
Оценка за ответ: 3

Комментарий к оценке: Общий алгоритм понятен, но есть некоторые тонкости, например, если заменять "123" на "12345" то произойдёт зацикливание и строка будет расти в бесконечность. Кроме того, хотелось бы узнать, как делать замену строк без учёта регистра...

Ответ #3. Отвечает эксперт: Косолапов Дмитрий Юрьевич

Помнится, есть функция StrReplace...

Ответ отправил: Косолапов Дмитрий Юрьевич (статус: 8-ой класс)
Время отправки: 28 августа 2006, 18:42
Оценка за ответ: 1

Комментарий к оценке: Вы бы перед отправкой ответа хоть Delphi открывали что ли... Такой функции в основных модулях нет.

Ответ #4. Отвечает эксперт: Иусов Сергей Ник.

Здравствуйте, Sunshine!
Советую посмотреть в сторону
function StringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string;
по дополнительному вопросу смотри параметр Flags

Ответ отправил: Иусов Сергей Ник. (статус: 3-ий класс)
Время отправки: 29 августа 2006, 06:56
Оценка за ответ: 5

Ответ #5. Отвечает эксперт: Виталий Лещенко

Здравствуйте, Sunshine!

Вот пример...

Приложение:
  1. uses SysUtils;
  2. {$Apptype Console}
  3. var
  4. s: string;
  5. begin
  6. s := 'HeLlO!';
  7. s := StringReplace(s, 'Hello', 'Hello', [rfReplaceAll, rfIgnoreCase]);
  8. WriteLn(s);
  9. end.


Ответ отправил: Виталий Лещенко (статус: 4-ый класс)
Время отправки: 29 августа 2006, 14:26
Оценка за ответ: 5

Ответ #6. Отвечает эксперт: Новаковский Юрий Аврамович

Предположим в Memo1 надо найти все вхождения строки из Edit1 в любом регистре и заменить на строку из
Edit2

procedure TForm1.Button1Click(Sender: TObject);
var
S,S1:string;
I,J,Po:integer;
begin
//Преобразуем строку поиска в верхний регистр
S1:=Edit1.Text;
for J := 1 to Length(S1) do S1[J] := UpCase(S1[J]);
//перебираем все строки
for I := to Memo1.Lines.Count-1 do
begin
//Преобразуем строку где ищем в верхний регистр
S:= Memo1.Lines;
for J := 1 to Length(S) do S[J] := UpCase(S[J]);

Po:= Pos(S1,S);//Поиск подстроки
if po=0 then Continue;//Не найдено-след строка
Delete(S,Po,Lenth(S1));//удалили
Insert(S1,S,Po);//вставили
Memo1.Lines:=S ;//вернули на место
end;
Удачи

Ответ отправил: Новаковский Юрий Аврамович (статус: 4-ый класс)
Время отправки: 29 августа 2006, 15:38
Оценка за ответ: 5

Комментарий к оценке: Спасибо.

Мини-форум вопроса

Всего сообщений: 1; последнее сообщение — 29 августа 2006, 00:31; участников в обсуждении: 1.
Матвеев Игорь Владимирович

Матвеев Игорь Владимирович (статус: Студент), 29 августа 2006, 00:31 [#1]:

При всем уважении, вопросы такой сложности следовало бы вообще фильтровать. Что тут может быть не понятного - Используете либо ReplaceStr, либо сами пишете вынкцию, не входящую в бесконечный цикл - работы на 15 мин. максимум.

31 января 2011, 19:56: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 17 октября 2017, 04:47
Выполнено за 0.03 сек.
Рейтинг@Mail.ru