Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > qstring::mid


Автор: implements 5.10.2011, 06:05
хочу вытащить подстроку из строки с определенного символа

к примеру вот строка

Message-ID: <CAH6xET-OmD0SPZJWgJ8fZ+MDTFMi7LfSdPiZHgrqqxZLzSsWyQ
Subject: tema pisma
From: =?KOI8-R?B?5M3J1NLJyiDtwcvB0s/X?= <bla-bla@mail.ru>
To: bum-bum@gmail.com
как скопировать тему письма, строку после Subject: ? надо найти первое вхождение перевода строки после Subject: ? и все что между ними скопировать, подскажите как это сделать по лучше

Автор: Snake174 5.10.2011, 06:32
Ну как-то так, наверно. Кривовато конечно.
Код

QString str = "Message-ID: <CAH6xET-OmD0SPZJWgJ8fZ+MDTFMi7LfSdPiZHgrqqxZLzSsWyQ \
      Subject: tema pisma \
      From: =?KOI8-R?B?5M3J1NLJyiDtwcvB0s/X?= <bla-bla@mail.ru> \
      To: bum-bum@gmail.com";

int begin = str.indexOf("Subject:");
int ends = str.indexOf("From:");

QString sss = str.mid( begin + 9, ends - (begin + 9) );
sss = sss.trimmed();
qDebug("STR: %s", sss.toAscii().data());

Автор: implements 5.10.2011, 06:44
Snake174,  да кстати не совсем пойдет(это строка ответ от pop3 сервера),стречается выше X-Envelope-From, и просто в теме письма может ыь From, тут что то другое надо

Автор: Snake174 5.10.2011, 06:56
Ну тогда итераторами попробуй:
Код

QString::ConstIterator itEnds  = str.constEnd();

for (QString::ConstIterator it = str.constBegin(); it != itEnds; ++it)
{
  if (*it == '\n' || *it == '\r')
  {
  }
}


Что-то в этом роде.

Инет что-то глючит.

Автор: implements 5.10.2011, 07:08
Snake174, не совсем понял, чем мне это поможет

Автор: Snake174 5.10.2011, 07:14
Как ты и писал ранее искать вхождение перевода строк. Между первым и вторым будет твоя тема.

Автор: implements 5.10.2011, 07:18
Snake174, я имел в виду пример с итераторами не понятен мне.
мне нужно найти From именно после Subject а не первый в строке

Автор: Snake174 5.10.2011, 07:30
Делай тогда без итератора. Допустим, ты знаешь позицию, в которой находится Subject (pos1). Тогда:
Код

for (int i = pos1;; ++i)
{
  if (str.at(i) == '\n' || str.at(i) == '\r')
  {
    Тема = str.mid( pos1, i - pos1 );
    break;
  }
}

Автор: implements 5.10.2011, 07:45
ок спс

Добавлено через 11 минут и 12 секунд
с темой понятно, а вот как все письмо распарсить полученное с pop3 уж затруднительно, много всего есть там, может есть примеры парсинга?

Автор: Amp 5.10.2011, 11:40
Разобрать письмо несложно. Затруднения там могут возникнуть только во вложенных друг в друга multipart-ах. Гугли по "c++ mime parser"

Кстати значение поля не обязательно будет находиться на одной строке с его именем. Например:
Код

Message-ID: <CAH4aHvT3+HRykT8Ywpj9tGqYn3bT3dRHYev0dbePc8JuaW0MyA@mail.gmail.com>
Subject: SOLVED: [opensuse] Connection refused on RDP connection to headless
 VirtualBox VM

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)