Вопрос № 22994: Здравствуйте уважаемые эксперты.
Допустим есть фраза "Мама мыла раму папой"
Как в Edit1 - добавить Мама
Как в Edit2 - добавить мыла
Как в Edit3 - добавить раму папой
в рассылке уже отвечали на подобный вопрос<b...
Вопрос № 22.994
Здравствуйте уважаемые эксперты.
Допустим есть фраза "Мама мыла раму папой"
Как в Edit1 - добавить Мама
Как в Edit2 - добавить мыла
Как в Edit3 - добавить раму папой
в рассылке уже отвечали на подобный вопрос
var
s : string;
i : integer;
begin
s:='Borland Delphi';
i:=Pos(' ',s);
RichEdit1.Lines.Add(Copy(s,1,i-1)); //Bordland
RichEdit2.Lines.Add(Copy(s,i+1,Length(s)-i)); //Delphi
end;
но у меня 4 слова и все мои эксперименты ни к чему не привели - помогите плиз.
Отправлен: 04.07.2005, 06:40
Вопрос задал: source (статус: Посетитель)
Всего ответов отправлено: 4
Отвечает: Ерёмин Андрей
Здравствуйте, source!
Поместите на форму 4 TEdit и TButton. Создайте обработчик нажатия кнопки. Код для него в приложении.
P.S. До чего дожили - уже людьми рамы моем... :)
Приложение:
--------- Если б не было бы глюка, жизнь была б такая скyка...
Ответ отправил: Ерёмин Андрей (статус: Студент)
Отправлен: 04.07.2005, 10:17
Отвечает: Jadd
Здравствуйте, source!
Дык в том-то и дело, что в твоем примере привязка идет к количеству слов, а не простой лексический анализ. Так вот, берем фразу и в цикле ее обрабатываем:
var
strLexema: String;
strMyString: String;
nIndex: Integer;
holder: TStringList;
begin
//допустим наша строка - тот идиотизм, который ты привел
strMyString := 'Мама мыла раму папой';
holder := TStringList.Create;
for nIndex:=1 to Length(strMyString)-1 do
begin
//проверяем на разделители слов: пробел, запятую, точку. Остальное уж как-нибудь сам по аналогии
if (strMyStrint[nIndex] = ' ') or (strMyString[nIndex] = ',') or (strMyString[nIndex] = '.') then
begin //если нашли разделитель
//убираем лишние пробелы
strLexema := Trimg(strLexema);
//сохраняем слово например в TStringList
holder.add(strLexema);
//очищаем лексему от всего и идем дальше
strLexema := '';
end
else
//в противном случае склеиваем лексему с текущим символом
strLexema := strLexema + strMyString[nIndex];
end;
//тут нужно проверить на последнее слово на случай, если предложение не закончено знаком пунктуации или пробелом
if (Length(strLexema) > 0) then
holder.add(strLexema);
end;
Примерно так. А затем ты можешь уже распарсеный текст поместить туда, куда хочешь. Заметь, в этом коде нету и намека на привязку к количеству слов.
--------- Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Студент)
Отправлен: 04.07.2005, 10:32
Отвечает: John Freeman
Здравствуйте, source!
Не слушай сишноков - они скоро уже s1:=s2 через strcpy делать будут:
Выглядит в нормальном виде это так:
var
o,s:string;//твоя строка и временная
c:integer;
begin
s:='мама мыла раму';
o:='';//очищаем буффер
for c:=1 to length(s) do begin
if s[c]=' ' then begin memo1.lines.add(o);o:=''; else begin
o:=o+s[c];
end;
end;
--------- You're trying to take me They trying to make me This is the only Gives me the only thing Tired of lying, I'm tired of lying The only thing I inderstand is what I feel...
Ответ отправил: John Freeman (статус: Профессор)
Отправлен: 04.07.2005, 14:55
Отвечает: sir henry
Здравствуйте, source!
В Дельфи есть функция Pos(), которая ищет позицию в строке того слова, которое Вы хотите. Далее, с помощью функции Copy() выдираете нужную Вам подстроку:
const
st = 'Мама мыла раму папой';
m = 'Мама';
l = 'мыла';
r = 'раму папой';
{Искомые слова не обязательно задавать в константах, можно и интерактивно, в том же Edit'е}
var
i: integer;
Begin
{Сначала ищем позицию подстроки в заданной строке st}
i:=0;
i:=Pos(m, st);
If i>0 Then
Edit1.Text:=Copy(st, i, Length(m));
{т.е. дословно, выдрать из строки st, начиная с позиции i, количество символов определяемые длиной подстроки m}
i:=Pos(l, st);
If i>0 Then
Edit2.Text:=Copy(st, i, Length(l));
i:=Pos(r, st);
If i>0 Then
Edit3.Text:=Copy(st, i, Length(r));
End;
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 05.07.2005, 04:51