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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.12.2013, 07:52   #1
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
Вопрос Замена сразу нескольких слов...

Здравствуйте, у меня проблема. Нужно в тексте заменить два разных слова на два других разных мною указанных слова и результат вывести в Memo. Код:

Код:
var
words:string;
begin
if Pos('привет', Memo1.Text)<>0 then
words:=StringReplace(Memo1.Text, 'привет', 'здравствуйте', [rfReplaceAll, rfIgnoreCase]);

if Pos('как дела?', Memo1.Text)<>0 then
words:=StringReplace(Memo1.Text, 'как дела?', 'отлично', [rfReplaceAll, rfIgnoreCase]);
Memo2.Lines.Add(words);
end;
Так вот оно заменяет или одно или другое слово (зависит от того в каком порядке расположен код) а мне нужно что бы сразу два или больше слов заменяло... Как это правильно реализовать? Спасибо.
FleXik вне форума Ответить с цитированием
Старый 01.12.2013, 10:08   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Во-первых, у Вас код делает не то, что Вы написали.
этот код заменяет не слово, а просто словочетание (набор букв, который к слову отношения не имеет). Напишите, например такой текст:
Приветствую тебя! Я к тебе пришёл с приветом!
выполните первую замену и убедитесь в том, что у Вас заменяются не слова, а набор заданных букв.
Впрочем, как Вы и сами можете догадаться, в тексте не может быть СЛОВА "Как дела?". При любом раскладе - это НЕ СЛОВО! Я бы сказал, что это, скорее, целое предложение!

во-вторых, если Вас устраивает замена по отдельности (несмотря на то, что меняются не слова), то чем Вас не устраивает последовательная замена?!!
Только написать её надо правильно. вот так примерно:
Код:
begin
words := Memo1.Text;
if Pos('привет', words)>0 then
   words:=StringReplace(words, 'привет', 'здравствуйте', [rfReplaceAll, rfIgnoreCase]);

if Pos('как дела?', words)>0 then
   words:=StringReplace(words, 'как дела?', 'отлично', [rfReplaceAll, rfIgnoreCase]);

Memo2.Lines.Add(words);
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.12.2013, 10:18   #3
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Приветствую тебя! Я к тебе пришёл с приветом!
Что-то мне кажется, что исправленный код тоже тут накосячит..
И тут получается шушуть интересный момент..
Можно заменять так.. Pos ('привет_').. (пробел я заменил на '_').. И дальше в StringReplace проводить тоже..
НО
Привет! Как дела?
Косячит..
Поэтому можно делать так (если других идей нет)..
Код:
const
     s = ' ,.!?'; // вроде всё..

for i := 1 to Length(s) do
      if Pos ('привет'+s[i], words) <> 0 then
            words:=StringReplace(words, 'привет'+s[i], 'здравствуйте'+s[i], [rfReplaceAll, rfIgnoreCase]);
Poma][a вне форума Ответить с цитированием
Старый 01.12.2013, 10:23   #4
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

Serge_Bliznykov, работает, но забыл упомянуть что у меня используется TStringList (думал со стринглистом и Memo будет одинаково...) так вот если делать так:

Код:
var
sl:TStringList;
words:string;
begin
sl:=TStringList.Create;
sl.LoadFromFile('trololo.txt');
words := sl.Text;

if Pos('привет', words)>0 then
   words:=StringReplace(words, 'привет', 'здравствуйте', [rfReplaceAll, rfIgnoreCase]);

if Pos('как дела?', words)>0 then
   words:=StringReplace(words, 'как дела?', 'отлично', [rfReplaceAll, rfIgnoreCase]);

Memo2.Lines.Add(words);
sl.Free;
с Memo работает а с TStringList не хочет... и у меня не предложение а именно слова, это я как пример дал...

----------------------------

в моем проэкте не работало, создал новый что бы проверить - работает, сейчас буду разбираться со своим проэктом...

Последний раз редактировалось FleXik; 01.12.2013 в 10:31.
FleXik вне форума Ответить с цитированием
Старый 01.12.2013, 10:39   #5
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

короче оказалось что я строку words := sl.Text; прописывал выше чем нужно было из-за этого работало не корректно, 2 часа мозг ломал, нервов не напасешься.... всем спасибо
FleXik вне форума Ответить с цитированием
Старый 01.12.2013, 10:50   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Pomaхa, твоя попытка сделать полноценный разбор по словам неудачна. Для примера слово 'Привет' pos не найдет. Тот же 'привет' может быть окончанием другого слова, по крайней мере теоретически. Но если бы другое слово было, то и практически. Можно еще мозгу напрячь и придумать какую-нибудь г
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 01.12.2013, 10:57   #7
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Pomaхa, твоя попытка сделать полноценный разбор по словам неудачна.
Ага..
Цитата:
Можно еще мозгу напрячь и придумать какую-нибудь г
Выбрасываем Pos.. и words := words+' '; Еще контрпримеры?
Poma][a вне форума Ответить с цитированием
Старый 01.12.2013, 12:29   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
Еще контрпримеры?
физкульт-привет заменится на физкульт-здрасте
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 01.12.2013, 13:01   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Регулярные выражения никто не захотел опробовать? Не?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.12.2013, 13:06   #10
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
физкульт-привет заменится на физкульт-здрасте
Ну а по-моему звучит лучше

Хорошо.. А как исправить? Можно искать с пробелом.. Но 'Привет '.. завалит.. Или ',привет,' тоже..
Poma][a вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание нескольких компонентов сразу в цикле artemavd Общие вопросы Delphi 40 08.06.2012 20:59
Очистка сразу нескольких StringGrid Artamos Компоненты Delphi 7 13.05.2011 13:58
Установка нескольких атрибутов сразу Shouldercannon Общие вопросы Delphi 7 01.05.2011 22:49
Создание сразу нескольких txt файлов Nice42ru Помощь студентам 11 11.02.2010 18:35
Дана строка, состоящая из нескольких слов. Найти количество слов, которые содержат хотя бы одну букву "А" Mashaa Помощь студентам 13 09.12.2009 13:28