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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.09.2011, 20:26   #1
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию Поиск по строке

Легкий вопрос, но все же: как найти все присущие в строке подстроки и записать индекс (начало) каждой.

Т.е. если мы имеем строку "Франция - прекрасная страна. Именно Франция бла-бла-бла". В результате должны получить к-ство найденных: 2, позиции найденных 1,37 (идеально было бы записать их в массив и получать индекс по нумерованию).

Можно через RichEdit, не принципиально.
kettanaito вне форума Ответить с цитированием
Старый 29.09.2011, 20:33   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

см функцию PosEx
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.09.2011, 20:38   #3
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

Код:
const ns='Франция';
var str:string;//это ваша строка
     i,cnt:=0; 
     p:array[1..10000]of Integer;//массив позиций нужного слова
i:=0;
cnt:=0
while i<=(Length(str)-Length(ns)) do
begin
   i:=i+1;
   if(Pos('Франция',str)<>0)then
   begin
      cnt:=cnt+1;
      array[cnt]:=i;
   end;
end;
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 29.09.2011, 20:52   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

NetSpace не сработает
Код:
  s:='Франция - прекрасная страна. Именно Франция бла-бла-бла';
  i:=1;
  j:=PosEx('ФРАНЦИЯ',AnsiUpperCase(s),1);
  while j>0 do begin
    //здесь записываем в массив j
    i:=j+Length('ФРАНЦИЯ');
    j:=PosEx('ФРАНЦИЯ',AnsiUpperCase(s),i);
  end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.09.2011, 20:53   #5
_Troy
Я не простой
Пользователь
 
Аватар для _Troy
 
Регистрация: 29.09.2011
Сообщений: 77
По умолчанию

Код:
var
  i: integer;
  result: array of word;
  s1, s2: String;
begin
  s1 := 'Франция - прекрасная страна. Именно Франция бла-бла-бла';
  s2 := 'Франция';
  while i <> 0 do
  begin
    i := Pos(s2, s1);
    if i > 0 then
    begin
      SetLength(result, length(result) + 1);
      result[length(result) - 1] := i + (length(s2) * (length(result) - 1));
      delete(s1, i, length(s2));
      i := -1;
    end;
  end;
end.
элементы result содержат позиции вхождения в исходную строку, т.е. 1 и 37
Знание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нем сведения

Последний раз редактировалось _Troy; 29.09.2011 в 20:59.
_Troy вне форума Ответить с цитированием
Старый 29.09.2011, 21:07   #6
_Troy
Я не простой
Пользователь
 
Аватар для _Troy
 
Регистрация: 29.09.2011
Сообщений: 77
По умолчанию

Аватар, твой способ получше будет. Эх, жаль не знал про PosEx...
Знание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нем сведения
_Troy вне форума Ответить с цитированием
Старый 01.10.2011, 14:32   #7
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию

Пример Аватара хорош, но так и не разобрался с записью результатов в массив. При попытке это сделать вылетает ошибка (да и результаты идут пустые, т.е. нули).

Пример _Troy возвращает нужный индекс (но и один лишний ноль в качестве найденного индекса) и так же не записывается в массив.
kettanaito вне форума Ответить с цитированием
Старый 01.10.2011, 14:44   #8
_Troy
Я не простой
Пользователь
 
Аватар для _Troy
 
Регистрация: 29.09.2011
Сообщений: 77
По умолчанию

Цитата:
Сообщение от kettanaito Посмотреть сообщение
Пример Аватара хорош, но так и не разобрался с записью результатов в массив. При попытке это сделать вылетает ошибка (да и результаты идут пустые, т.е. нули).

Пример _Troy возвращает нужный индекс (но и один лишний ноль в качестве найденного индекса) и так же не записывается в массив.
Чего у тебя не записывает? Как мой пример, так и пример Аватар, работают отлично. И как мой вариант не пишет в массив, когда там явно указано как он записывает? И откуда у тебя вообще ноль взялся?

Вот для проверки

Код:
for i := 0 to high(result) do
   ListBox1.items.add(IntToStr(result[i]));
Индексы, именно для твоего примера, равны: 1, 37

Вот пример Аватар

Код:
var
  result: array of Integer;
begin
  s := 'Франция - прекрасная страна. Именно Франция бла-бла-бла';
  i := 1;
  j := PosEx('ФРАНЦИЯ', AnsiUpperCase(s), 1);
  while j > 0 do 
  begin
    //здесь записываем в массив j
    SetLength(result, Length(result) + 1);
    result[Length(result) -1 ] := j;
    i := j + Length('ФРАНЦИЯ');
    j := PosEx('ФРАНЦИЯ', AnsiUpperCase(s), i);
  end;
end;
Знание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нем сведения

Последний раз редактировалось _Troy; 01.10.2011 в 14:54.
_Troy вне форума Ответить с цитированием
Старый 01.10.2011, 14:49   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

kettanaito
пример Аватар вполне себе хорош.
Не вижу в нём проблем.
Давайте свой код, как Вы его модернизировали так, чтобы он в массив писал.. (я на 99.99% уверен, что именно в этом у Вас "косяк").

Последний раз редактировалось Serge_Bliznykov; 01.10.2011 в 14:51.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.10.2011, 14:52   #10
Lesha
Форумчанин
 
Аватар для Lesha
 
Регистрация: 30.01.2009
Сообщений: 418
По умолчанию

Код:
uses StrUtils;

{ ... }

function Pos_Ultimate(const substr, str: string; var codes: Array of Integer):integer;
var p:integer;
begin
  result:=0;
  if length(str)>0 then begin
    p:=pos(substr,str);
    while p>0 do begin
     codes[result]:=p;
     p:=PosEx(substr,str, codes[result]+1);
     inc(result);
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var cod: array of Integer; count,i: integer; s:string;
begin
  SetLength(cod,100);
  count:=Pos_Ultimate('Франция',
    'Франция - прекрасная страна. Именно Франция бла-бла-бла',
    cod);
  if (count=0) then
    ShowMessage('Нет совпадений')
  else begin
    s:='';
    for i := 0 to count - 1 do
      s:=s+inttostr(cod[i])+', ';
    ShowMessage(s);
  end;
end;

Последний раз редактировалось Lesha; 01.10.2011 в 14:59.
Lesha вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
поиск в строке Apis Помощь студентам 1 27.04.2010 22:30
поиск в строке Apis Паскаль, Turbo Pascal, PascalABC.NET 2 27.04.2010 22:05
поиск в строке Apis Общие вопросы C/C++ 1 27.04.2010 22:04
Поиск в строке. Xcopy Общие вопросы Delphi 1 12.10.2009 00:31
Поиск в строке xspider Общие вопросы C/C++ 5 04.02.2009 21:46