Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 623

/ вопрос решён /

Здравствуйте, уважаемые эксперты! Мне хотелось бы чтобы вы научили меня парсить! А именно я написал простенького бота для irc, это было не сложно, т.к. компонент не такой уж и сложный в изучении. Но мне хотелось бы его немного автоматизировать и отлавливать и обрабатывать входящие сообщения, чтобы например определенное слово служило ему сигналом! (Например "help") Заранее благодарен!

Приложение:
  1.  
  2.  
  3. procedure TForm1.IdIRC1Message(Sender: TObject; AUser: TIdIRCUser;
  4. AChannel: TIdIRCChannel; Content: String);
  5. begin
  6. Memo1.Lines.Add('<'+AUser.Nick+'> ' + Content);
  7. end;


Fen-Omen Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Fen-Omen (статус: Посетитель)
Вопрос отправлен: 10 июня 2007, 23:23
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Fen-Omen!
Для того, что бы "парсить" достаточно следующих функций
function Copy(s:string;start,count:integer):string;
эта функция вытянет с строки s count символов начиная с позиции start. Если символов будет нехватать, то будет взято скоко, скоко есть.
Delete(s:string;start,count:integer);
эта процедура удадит с строки s count символов начиная с позиции start.
function pos(p,s:string):integer;
производит поиск подстроки p в строке s. Если найдено - возращает позицию. Если нет, возвращает ноль.
Функция ищет только первое вхождение.
Для поиска последующие надо пользоваться функцией
function pos(p,s:string; posstart:integer):integer;
которая начинает свой поиск с позиции posstart. К сожалению появилась только в 7 делфи.
Также неплохо будет знать о функции Trim(s:string):string;
Эта фунция возвращает строку без конечных пробелов.
Length(s:string):integer; - возвращает длину строки. только неверте сишникам, что эта функция медлена и её надо заменять на присваивание переменной и выносить за пределы цикла. На самом деле это может только замедлить. Почему так? это с отладчиком посидите, посмотрите дизасемблированный код - поймёте.

Этих функций достаточно, что бы писать парсеры любой сложности.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 11 июня 2007, 02:55
Оценка за ответ: 5

Комментарий к оценке: Спасибо за помощь!

Ответ #2. Отвечает эксперт: Denisss

Здравствуйте, Fen-Omen!

Чтобы определить наличие слова 'help' в тексте, нужно воспользоваться функцией Pos:

if (Pos('HELP', UpperCase(Content)) > 0) then
...

Если же определенным сигналом служит сообщение, содержащее только слово 'help', то:

if (UpperCase(Content) = 'HELP') then
...

Функция UpperCase преобразует всю строку в верхний регистр (это нужно, чтобы пользователь мог также написать и 'Help' или 'hElp' - в общем, так, как ему задумается.

Данная функция будет работать только с латинскими символами. Для преобразования строки, содержащей кириллицу в верхний регистр, нужно использовать функцию AnsiUpperCase.

Если важен регистр, то функцию UpperCase нужно убрать и сравнивать не с 'HELP', а с 'help'.

Вместо UpperCase (или AnsiUpperCase) можно воспользоваться функцией LowerCase (или AnsiLowerCase) - она преобразует строку в нижний регистр. Тогда нужно будет сравнивать строку с 'help'.

Удачи!

Ответ отправил: Denisss (статус: 2-ой класс)
Время отправки: 11 июня 2007, 12:20
Оценка за ответ: 5

Комментарий к оценке: Denisss, все стало понятней! Огромная благодарность!

Мини-форум вопроса

Всего сообщений: 0.

31 января 2011, 19:27: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:29
Выполнено за 0.02 сек.