Замена слов в рандомном порядке в Memo
Идея такова:
В
Memo1.Textнаходится простой текст.В
Memo2.Textнаходятся слова для рандомной замены в текстеMemo1. К примеру:Слово #1|Замена1|Замена2|Замена3 Слово №2|Замена1|Замена2|Замена3 Слово №3|Замена1|Замена2|Замена3То есть в
Memo1расположен сам текст, а вMemo2словарь синонимов, слов и варианты их замены.При нажатии на кнопку в
Memo1идет замена слов на синонимы изMemo2.
Вопрос: Где в коде у меня ошибка ? Поскольку у меня получается, что замена идет только первых слов, что в тексте (строках) Memo1, а должна быть замена по всей строке.
Вот мой код и может его можно как упростить?
Var
SynArr: Array of Array of String;
SynList: TStringList;
i, j, m: Integer;
begin
SetLength(SynArr, 0);
SynList := TStringList.Create;
// Тут идет подключение Слов и к ним синонимов в Memo2
Memo2.Lines[i] := StringReplace(WrapText(Memo2.Lines[i], #13#10, ['|'], 1),
'|', '', [rfReplaceAll]);
SetLength(SynArr, Length(SynArr) + 1);
SetLength(SynArr[High(SynArr)], Memo2.Lines.Count);
// Обработка в цикле синонимов
for i := 0 to Memo2.Lines.Count - 1 do
SynArr[High(SynArr), i] := Memo2.Lines.Strings[i];
SynList.Free;
// Замена слов на синонимы в Memo1
for i := 0 to High(SynArr) do
for j := 0 to High(SynArr[i]) do
for m := 0 to Memo1.Lines.Count - 1 do
Memo1.Lines[m] := StringReplace(Memo1.Lines[m], SynArr[i, j],
SynArr[i, Random(High(SynArr[i])) + 1], []);
end;
Ответы (1 шт):
Автор решения: MBo
→ Ссылка
Ну давайте попробуем так:
- разбиваем каждую строку первого списка на список слов по пробелам и запятым (commatext)
- проверяем, не содержится ли слово в словаре
- если да - то заменяем его на один из синонимов, выбирая индекс синонима случайно
- после обработки всех слов строки собираем их обратно (тот же commatext в обратном направлении)
- записываем измененную строку назад в список