|
Вопрос # 114/ вопрос решён / |
|
Здравствуйте, уважаемые эксперты!
Каким образом можно осуществить замену одного фрагмента на другой в определённой строке? Например, в большом тексте нужно заменить "123" на "456". Как это проще всего реализовать? И дополнительный вопрос: как осуществить тоже самое, но не обращая внимание на регистр, т.е. и "привет", и "ПРИВЕТ" и "пРиВеТ" должно замениться на "Hello"?
Заранее благодарю за ответы.
 |
Вопрос задал: 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!
Вот пример...
Приложение: Переключить в обычный режим- uses SysUtils;
- {$Apptype Console}
- var
- s: string;
- begin
- s := 'HeLlO!';
- s := StringReplace(s, 'Hello', 'Hello', [rfReplaceAll, rfIgnoreCase]);
- WriteLn(s);
- 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)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|