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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.04.2011, 19:01   #1
aquatell
 
Регистрация: 16.04.2011
Сообщений: 9
По умолчанию Поиск вхождения подстроки в тексте

Всем привет!
Ребята помогите пожалуйста очень нужна помощь.
Есть поле Memo в нем есть некий текст. Нужно разделить этот текст на
слова, включая предлоги. Затем выполнить поиск вхождений каждого слова в этом тексте. Кроме предлогов. Например: В лесу влесув. Стандартным способом выдает 2 вхождения символа "в", а мне надо раздельно Предварительно функцией AnsiLowerCase делаю весь текст строчным буквами, также полностью удаляю все знаки препинания и оставляю только текст и пробелы. Также в конце текста добавляю 1 пробел и затем в цикле пробегаю по этим пробелам чтоб извлечь слова и вхождения. Найденное вхождение удаляю из переменной String.
В общем надо так: слова отдельно извлекать и предлоги отдельно, и поиск
вхождений так же само: предлоги отдельно считать а слова отдельно.
Очень нужна Ваша помощь!
aquatell вне форума Ответить с цитированием
Старый 16.04.2011, 19:07   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Есть такой модуль StrUtils (стандартный) и та есть функция PosEx

а ещё есть это http://www.delphifaq.ru/poisk-n-ogo-...u_item322.html

Последний раз редактировалось Человек_Борща; 16.04.2011 в 19:09.
Человек_Борща вне форума Ответить с цитированием
Старый 16.04.2011, 19:12   #3
aquatell
 
Регистрация: 16.04.2011
Сообщений: 9
По умолчанию

А можно пример пожалуйста, я пока не сильна в делфи, я только новичок Но очень нужно, так как в понедельник надо уже сдавать курсовую работу
aquatell вне форума Ответить с цитированием
Старый 16.04.2011, 19:23   #4
aquatell
 
Регистрация: 16.04.2011
Сообщений: 9
По умолчанию

Нет это не то. Мне надо что из строки извлекались слова, учитывая и дубликаты, и чтоб считались сколько раз они в тексте. Далее все это дело надо в StringGrid сколько уникальны слов в тексте и сколько раз они там встретились в том числе и предлоги, но предлоги в словах считать не нужно если например предлог "в" встретился в слове Вася.
aquatell вне форума Ответить с цитированием
Старый 16.04.2011, 20:18   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

тоесть есть предложение "1111 1 2222 3 444 3 3 2 4 33333 2 1 111 3 22 1" (цифры слова и предлоги)
Нужно найти сколько раз встречается слова в данном предложении?

Допустим:
Пять 1иц
4 2ки
1 3ка


Ну это не сложно.

и примерно так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
const
  Pd: array[0..3] of string = (' 1 ', ' 2 ', ' 3 ', ' 4 ');
  aMsg = 'Слово: %s попалось %d раз.';
var
  s: string;
  i, p: Integer;
begin
  for i := 0 to 3 do
  begin
    p := 0;
    s := Edit1.Text;
    while not (Pos(pd[i], s) = 0) do
    begin
      Delete(s, Pos(pd[i], s), Pos(pd[i], s) + length(Pd[i]));
      p := p + 1;
    end;

    if Pos(pd[i], s) = 0 then
    begin
      Memo1.Lines.Add(Format(aMsg, [Pd[i], p]));
    end;
  end;
end;
Человек_Борща вне форума Ответить с цитированием
Старый 16.04.2011, 20:33   #6
aquatell
 
Регистрация: 16.04.2011
Сообщений: 9
По умолчанию

БОЛЬШОЕ СПАСИБО ТЕБЕ ДОБРЫЙ ЧЕЛОВЕК!!!
aquatell вне форума Ответить с цитированием
Старый 16.04.2011, 20:45   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Раз речь идёт про дельфи, то я бы предложил такой вариант:
проход по тексту - замена ВСЕХ знаков препинания на пробелы.
буквально пара строк кода:
Код:
 for i:=1 to Length(S) do
   if s[i] in [':','.',',','!','?','(',')'] then s[i] := ' ';
дальше в цикле все многократно идущие подряд пробелы заменил на один:
Код:
while Pos('  ', S)>0 then Delete(S, Pos('  ',S), 1);
дальше разделил текст на отдельные слова с помощью компонента TStringList:
Код:
Var TS : TStringList;
...
   TS := TStringList.Create();
   TS.Delimiter := ' ';
   TS.DelimitedText := S;

   TS.Sort; {если надо все слова отсортировать...}

   // тут делаем что надо со словами..

   FreeAndNil(TS);
Единственно слабое звено - а как Вы предлоги отличите от слов?
Например, в таком предложении:
Эдгар По написал произведение, по которому поставили спектакль "По По".
или в таком:
Подсчитайте сколько раз буквы К и В входят в текст.

ну, если с этим не заморачиваться - тогда можно просто удалить все предлоги из списка (или перенести их в другой список)..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.04.2011, 23:18   #8
aquatell
 
Регистрация: 16.04.2011
Сообщений: 9
По умолчанию

Еще раз благодарю всех тех кто откликнулся! Огромное вам спасибо!
Функция моя доработана, может немного и примитивно зато работает, вот выкладываю, возможно кому то и пригодится такой вариант, если кто то доработает, будет только лучше :-)
Предварительно из передаваемого в функцию значения str-вырезаны все знаки препинания, и в конец добавлен пробел. В значение substr - передается подстрока которую ищем. Функция возвращает весь текст но уже без той подстроки которую мы искали.
Код:
function Hirurg(substr, str:string):String;
Var
bsleftright,bsleft,bsright:Integer;
Str2:String; 
Begin
Str2:=str;
bsleft:=0;
bsright:=0;
bsleftright:=0;
while Pos(substr+' ',str2)>0 do 
begin
if Pos(' '+substr,str2)=1 then
bsleft:=Pos(' '+substr,str2); 
bsright:=Pos(substr+' ',str2); 
bsleftright:=Pos(' '+substr+' ',str2); 
{--тут пишем три условия
// слева есть пробел, справа нет
// справа есть пробел, слева нет
// слева и справа есть пробелы --}

if (bsleft>0) and (bsright=0) then
Delete(Str2,bsleft,Length(substr));
if (bsleft=0) and (bsright>0) then
Delete(Str2,bsright,Length(substr)+1);
if (bsleft>0) and (bsright>0) then
Delete(Str2,bsleftright,Length(substr)+1);
Result:=Str2;
end;
end;

________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 17.04.2011 в 00:04.
aquatell вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Из текста удалить все вхождения некоторого наперед заданного символа и символ, стоящий в тексте перед ним LittleStudent Помощь студентам 1 15.04.2011 00:46
Поиск подстроки int 20h Win Api 2 09.08.2010 20:37
поиск подстроки в строке!!! StoneSour Общие вопросы C/C++ 2 15.03.2010 21:31
Поиск файла до первого вхождения? Rossoman Microsoft Office Excel 2 16.10.2009 19:49