Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Анализ и извлечение слов из предложения. Получение каждого слова отдельно 
V
    Опции темы
Softaz
Дата 19.3.2006, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


wasm
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 16.1.2006

Репутация: нет
Всего: 16



Частной целью является получение слов из введенного в поле (Memo, RichEdit) предложения. И запись в переменную (желательно в цикле и без использования массивов) каждого слова.
Маленький рабочий пример набросал. Однако, он "падает" при некоторых вещах: например, после запятой нет пробела или стоит несколько пробелов сразу.
Нет ли готового решения? Пока в голову ничего не приходит
Код

//цикл
  repeat
//Убираем ненужные символы (знаки препинания и др.)
  MEmo1.Text := StringReplace(memo1.Text, ',', '', [rfReplaceAll]);
  {
  ...  ...
  ...  ...
  }
  MEmo1.Text := TrimLeft(MEmo1.Text);

  str1 := MEmo1.Text;//
  i:=pos(' ',str1); //сколько символов с начала строки до первого пробела?
  comd:=copy(str1,0,i-1); //скопируем их в переменную comd (это и есть слово)
  MEmo1.Text := StringReplace(memo1.Text, comd+' ', '', [rfReplaceAll]);//и удаляем их из Memo вместе
                                                                        // с идущим за ним пробелом
  MessageBox(0, Pchar('/'+comd+'/'), '', mb_ok);//А вот и слово!

  until(comd = '');
//_цикл


Это сообщение отредактировал(а) Softaz - 19.3.2006, 20:04


--------------------
Разочарованный в .NET
PM MAIL WWW   Вверх
Демо
Дата 19.3.2006, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Вот типичный конечный автомат:

Код

procedure SplitStr(const Src: String; L: TStrings);
type
    TState=(stNone,stWord);
var
    i: Integer;
    LenSrc: Integer;
    State: TState;
    bPos: Integer;
begin
    State := stNone;
    LenSrc := Length(Src);
    i := 1;
    bPos := 1;

    while i<=LenSrc do
    begin
        case State of
            stNone:
                if not (Src[i] in [' ',',','.','!','?']) then
                begin
                    State := stWord;
                    bPos := i;
                end;
            stWord:
                if Src[i] in [' ',',','.','!','?'] then
                begin
                    State := stNone;
                    L.Add(Copy(Src,bPos,i-bPos));
                end;
        end;
        Inc(i);
    end;
    if State=stWord then L.Add(Copy(Src,bPos,LenSrc-bPos+1));
end;


Код

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
    s: String;
begin
    s := ' Мама, мыла! раму!';
    SplitStr(s,Memo1.Lines);
end;



--------------------
    
PM MAIL ICQ Skype   Вверх
Softaz
Дата 19.3.2006, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


wasm
**


Профиль
Группа: Участник
Сообщений: 373
Регистрация: 16.1.2006

Репутация: нет
Всего: 16



Демо, Большое Спасибо!



--------------------
Разочарованный в .NET
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0435 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.