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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.04.2012, 20:45   #1
alexmcoder
 
Регистрация: 23.04.2009
Сообщений: 7
По умолчанию Проблема с поиском слов в строке

Всем привет.

Функцией pos пытаюсь найти позицию нужного мне слова в строке

Например:
строка:
s:='Весной фотограф сделал фото';
поиск:
pos('фото',s)

Так вот, функция находит позицию слова " фотограф ", а мне нужно найти слово " фото ".
Пробывал искать с пробелом: pos('фото ',s), результат тот же.

Вопрос:
Как найти слово в строке целиком, без его вхождений в другие слова?
alexmcoder вне форума Ответить с цитированием
Старый 16.04.2012, 21:22   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

После нахождения позиции 'фото' анализировать символы слева и справа, если там пробелы, знаки пунктуации, перевод каретки или конец (начало) всей строки, то слово найдено. Иначе искать дальше, с помощью например, PosEx
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.04.2012, 21:25   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Хитрый ход:
Код:
s:='Весной фотограф сделал фото';
 s:=' '+s+' ';
 ...:=pos(' фото ',s)
Идея понятна? Искусственно отделить в поисковом критерии слово.
Цитата:
Иначе искать дальше, с помощью например, PosEx
А если у автора Д6 или ниже, как у меня?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.04.2012, 07:32   #4
alexmcoder
 
Регистрация: 23.04.2009
Сообщений: 7
По умолчанию

Решил следующим образом:

Код:
const
//Разделители
D = ['.', ',', ':', ';', '!', '?', '-', ' ', #9, #10, #13];
var
i,j,x,y:integer;
s,s2,slovo:string;
begin
s:='Весной фотограф сфотографировал своё лучшее фото для фотоальбома ';
slovo:='фото';
i:=0;
while i<length(s)  do begin
inc(i);
x:=posex(slovo,s,i); // ищем слово в строке
if x<>0 then  begin   // если найдено то...

if (s[x-1] in D) or (i=1) then begin // проверяем начало найденного слова


for j := x+1 to length(s) do begin // ищем конец найденного слова
s2:='';
if s[j] in D then  begin s2:=copy(s,x,j-x); i:=j;break; end;

                             end;
// сравниваем
if AnsiCompareStr(slovo,s2)=0 then  begin
                  // нужное слово найдено
                   //здесь x позиция целого слова в строке
                   // или просто TRUE если такое слово есть в строке

                                   break;
                                     end;

                    end else i:=x+1;
              end
              else break;// если слово не найдено

              end;

в принципе все работает, но если можно оптимизировать код, то подскажите
alexmcoder вне форума Ответить с цитированием
Старый 17.04.2012, 07:48   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Мне идея от Stilet понравилась, только адаптировать ее для строк со специальными символами. В начало и конец по пробелу и в цикле по-символьно перетащить в другую строку, вставляя вместо каждого специального символа его же с пробелами слева и справа. И тогда просто Pos(' фото ',s) или еще лучше Pos(' ФОТО ',AnsiUpperCase(s))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 17.04.2012 в 08:00.
Аватар вне форума Ответить с цитированием
Старый 17.04.2012, 09:00   #6
denisbrain
Форумчанин
 
Регистрация: 29.05.2011
Сообщений: 449
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Мне идея от Stilet понравилась, только адаптировать ее для строк со специальными символами. В начало и конец по пробелу и в цикле по-символьно перетащить в другую строку, вставляя вместо каждого специального символа его же с пробелами слева и справа. И тогда просто Pos(' фото ',s) или еще лучше Pos(' ФОТО ',AnsiUpperCase(s))
как вариант
// полностью библиотека будет доступна на сайте netsoftware.ucoz.ru
для свзяи ICQ 368-253-335


Код:
unit Unit_N_for_string;

function LowerCaseRus(const S: string): string; // Выравнивает регистр с учетом русских букв (на выходе получаем строку с нижним регистром )
function UpperCaseRus(const S: string): string; // Выравнивает регистр с учетом русских букв (на выходе получаем строку с Верхним регистром )
Function GetPosIndex(s:string;index:integer;len:integer=0):Tpoint; //Возвращает слово в позиции номер
Function GetSlovoIndex(s:string;index:integer;len:integer=0):string; // Возвращает слово из текста S номер слова
Function GetWordCount(s:string;len:integer=0):integer; // возвращает кол-во слов в тексте
Function GeTTextFromNotDoubleWord(TextValue:string;RegYes:boolean=false):string; // Возвращает строку без дубликатов слов RegYes =true С учетом регистра RegYes =true // без учета регистра
Function GetMaxLengthWord(s:string):string; //Возвращает слово максимальной длины
Function GetMinLengthWord(s:string):string; // Возвращает слово минимальной длины
Function GetWordList(TextValue:string):string; // Возвращает список уникальных слов в тексте
Procedure CreateDocument(var Value:Tdocument; BodyText:string;Len:integer=0;regYes:boolean=false); // Создаем список слов и их позиции в тексте BodyText // len ограничения на длину текста
// regYes- работа с учетом регистра
Function GetMaxLengthWords(Value:Tdocument):string; // возвращает максимальное по длине слово из структуры Tdocument
Function GetMinLengthWords(Value:Tdocument):string; // возвращает минимальное по длине слово из структуры Tdocument
Function GetPositionWord(AllText:Tdocument;Valuetring:string;regYes:boolean=false):integer; // возвращает позицию слова в документе
Код:
uses Unit_N_for_string;

var s:string;
    s2:Tdocument;
    BigWordIndex:Integer;
begin

    s:=form1.Memo1.Lines.Text;
    form1.ListBox1.Items.Clear;
    form1.ListBox1.Items.Add('Всего символов  "'+Inttostr(length(s))+'"');
    form1.ListBox1.Items.add(DateTimeTostr(now)+':'+'Начало метод 1 ');
    form1.ListBox1.Items.Add('Кол-во слов в тексте '+inttostr(GetWordCount(s)));
    form1.ListBox1.Items.Add('Самое длинное слово "'+GetMaxLengthWord(s)+'"');
    form1.ListBox1.Items.Add('Самое короткое слово "'+GetMinLengthWord(s)+'"');
    form1.ListBox1.Items.add(DateTimeTostr(now)+':'+'Выполнен метод 1  ');

    form1.ListBox1.Items.add(DateTimeTostr(now)+':'+'Начало метод 2 ');
    CreateDocument(s2,form1.memo1.lines.text); // создаем план документа
    form1.ListBox1.Items.Add('Самое длинное слово "'+GetMaxLengthWords(s2)+'"');
    form1.ListBox1.Items.Add('Самое короткое слово "'+GetMinLengthWords(s2)+'"');
    BigWordIndex:=GetPositionWord(s2,GetMaxLengthWords(s2)); // получаем номер самого длинного слова в тексте
    form1.ListBox1.Items.Add('Самое длинное слово имеет номер '+inttostr(BigWordIndex+1));


    form1.ListBox1.Items.Add('Самое длинное слово находится '+inttostr(s2.WordList[BigWordIndex].PosX));




    form1.ListBox1.Items.add(DateTimeTostr(now)+':'+'Выполнен метод 2  ');
end;

Код:

 Tdocument=record
   WordList:array of TwordPosition;
   WordListCount:Integer;
   RegYes:boolean;
end;
Код:

var s2:Tdocument;
    SeachIndex:integer;
begin
CreateDocument(s2,form1.memo1.lines.text); // создаем план документа
  SeachIndex:=GetPositionWord(s2,'фото');
   if  SeachIndex>-1 then begin
    form1.ListBox1.Items.Add('Номер слова '+inttostr(SeachIndex+1));
    form1.ListBox1.Items.Add('Позиция '+inttostr(s2.WordList[SeachIndex].posx));
    form1.Memo1.SetFocus;
    form1.Memo1.SelStart:=s2.WordList[SeachIndex].posx-1;
    form1.Memo1.SelLength:=s2.WordList[SeachIndex].WordLength;
    end;


end;

end.
Вложения
Тип файла: zip Unit_N_for_string.zip (2.7 Кб, 39 просмотров)
задания на pascal/delphi ICQ 368254335
Tel +79177425326 mail denis-naymov1985(at)mail.ru login skype denis.new.skype

Последний раз редактировалось denisbrain; 17.04.2012 в 09:32.
denisbrain вне форума Ответить с цитированием
Старый 17.04.2012, 10:08   #7
alexmcoder
 
Регистрация: 23.04.2009
Сообщений: 7
По умолчанию

denisbrain, большое спасибо, все отлично работает,
вопрос закрыт.
alexmcoder вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение кол-ва слов в строке и сопоставление аналогичной строке. kish_mish Общие вопросы C/C++ 0 12.03.2012 20:58
Ввести с клавиатуры строку. Посчитать количество слов в строке. Определить, что является разделителем слов. Вывести рез-ть на экра Газимов Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 02.03.2012 15:58
Просьба помочь разобраться с поиском в строке по алгоритму Бойера-Мура Ветас Помощь студентам 1 16.11.2009 18:52