|
Вопрос # 3 281/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты!
есть пример текста:
=========
снег
волна
=========
мусор
=========
снег
дерево
дети
=========
есть простой поиск через POS
if (Pos('дети', Strings[Index]) <> 0) ...
который выводит в TStringList строку, где есть слово "дети", а как организовать поиск строк между "======" по слову "дети"
т.е. в результате заносится в TStringList только:
=========
снег
дерево
дети
=========
если возможно примером кода.
Заранее спасибо.
 |
Вопрос задал: paradale (статус: Посетитель)
Вопрос отправлен: 13 октября 2009, 14:12
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Егор
Здравствуйте, paradale!
Ставите на форму два Memo и кнопку. Обработчик кнопки приведён в приложении.
После запуска в первое мемо забиваете исходный текст, во втором - получаете искомые строчки.
Приложение: Переключить в обычный режим- procedure TForm1.Button1Click(Sender: TObject);
- var
- i, i1, i2 : integer;
- begin
-
-
- inc(i);
- if i=Memo1.Lines.Count then
-
-
-
- i1:=i;
- i2:=i;
-
-
- while (Pos('=========', Memo1.Lines[i1])=0) and (i1>0) do
- dec(i1);
-
-
- while (Pos('=========', Memo1.Lines[i2])=0) and (i2<Memo1.Lines.Count-1) do
- inc(i2);
-
-
- for i:=i1 to i2 do
- Memo2.Lines.Add(Memo1.Lines[i]);
- end;
 |
Ответ отправил: Егор (статус: 10-ый класс)
Время отправки: 13 октября 2009, 18:58
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 10; последнее сообщение — 14 октября 2009, 21:12; участников в обсуждении: 4.
13 октября 2009, 14:36: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Алгоритмы, преобразования модератором Ерёмин А.А.
|
min@y™ (статус: Доктор наук), 13 октября 2009, 15:05 [#1]:
Нифига не понял. Объясни подробнее.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Вадим К (статус: Академик), 13 октября 2009, 15:32 [#2]:
кучка знаков равно - это часть текста, которые как бы ограничивают блок? и хочется вывести только тот блок, который содержит заданное слово?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Егор (статус: 10-ый класс), 13 октября 2009, 15:34 [#3]:
я так понял:
=========
снег
волна
=========
- детей нет, не выводим
=========
мусор
=========
- детей нет, не выводим
=========
снег
дерево
дети
=========
- дети есть, выводим
так?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
Егор (статус: 10-ый класс), 13 октября 2009, 15:42 [#4]:
проще всего - сначала найти строчку с детьми, а потом уже двигаться вверх и вниз в поисках ограничителей
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
paradale (статус: Посетитель), 13 октября 2009, 18:13 [#5]:
да. куча знаков равно - это часть текста.
Егор:
вы правильно поняли. так.
|
|
paradale (статус: Посетитель), 14 октября 2009, 18:36 [#6]:
Егор:
спасибо вам большое.
|
|
Егор (статус: 10-ый класс), 14 октября 2009, 18:47 [#7]:
спасибо?
а оценка за ответ где?
"а компот?"
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
paradale (статус: Посетитель), 14 октября 2009, 20:49 [#8]:
сейчас будет оценка ) не успел.
только доп. вопрос.
ваш код ищет только первое вхождение, а как быть с последующими? пример:
=========
снег
дерево
дети
=========
витязь
=========
вода
радуга
дети
=========
ищем по слову дети и в мемо2 выводится только первое вхождение
=========
снег
дерево
дети
=========
|
|
paradale (статус: Посетитель), 14 октября 2009, 20:50 [#9]:
а необходимо еще вывести и второе
|
|
Егор (статус: 10-ый класс), 14 октября 2009, 21:12 [#10]:
ну вот ведь, а!
как суп, так и ложку 
так и надо было писать, что нужно было все вхождения найти 
вот, держите:
procedure TForm1.Button1Click(Sender: TObject);
var
i, i1, i2, k : integer;
begin
Memo2.Clear; // очистим второе мемо перед выводом туда
// ищем детей:
for i:=0 to Memo1.Lines.Count-1 do
if (Pos('дети', Memo1.Lines[i])>0) then
begin
i1:=i;
i2:=i;
// будем искать предыдущие знаки "равно"
while (Pos('=========', Memo1.Lines[i1])=0) and (i1>0) do
dec(i1);
// будем искать последующие знаки "равно"
while (Pos('=========', Memo1.Lines[i2])=0) and (i2<Memo1.Lines.Count-1) do
inc(i2);
// теперь запишем выделенные строчки во второе мемо
for k:=i1 to i2 do
Memo2.Lines.Add(Memo1.Lines[k]);
end;
end;
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|