Russian Qt Forum

Qt => Общие вопросы => Тема начата: izoomer от Ноябрь 21, 2006, 00:40



Название: вопрос по QRegExp
Отправлено: izoomer от Ноябрь 21, 2006, 00:40
получаю строку из stdout вида
10%:in progress
нужно в отделить в разные QString число процентов (число перед знаком процентов)и текст после двоеточия. ДУмаю легче всего с помощью регулярных выражений и QRegExp , но не знаю как. Подскажите как сделать в QT-4.2 такое.

добавлено спустя 2 часа 8 минут:

 вот выражение которое работает в приложении $QTDIR/examples/tools/regexep/regexp и код его использующий:
Код:

QString stdout,value,text;
stdout="20%:in progress"
QRwgExp exp("^([0-9]+)%:(.*)$");
exp.indexIn(stdout);
value=exp.cap(0);
text=exp.cap(1);
в полях capture 1 и capture 2 выводит число и текст соответственно, а в моем приложении не работает.
[code]
qDebug << value << text
[/сщву]
выводит пустые места
что не так ?


Название: вопрос по QRegExp
Отправлено: Вудруф от Ноябрь 21, 2006, 08:27
В данном случае можно обойтись без QRegExp. Пусть полученная строка хранится в std::string str.
1. Просто вводим число.
std::string::size_type idx1 = str.find_first_of ("1234567890");
std::string::size_type idx2 = str.find_first_not_of ("1234567890", idx1);
std::istrstream input (str.substr (idx1, idx2 - idx1));
unsigned int x;
input >> x;
2. Получаем текст после запятой.
std::string text = str.substr (str.find (':', idx2) + 1);

Можно гораздо локаничнее, но так (как мне кажется) получается эффективнее.


Название: вопрос по QRegExp
Отправлено: GqRun от Ноябрь 21, 2006, 10:39
Проще всего, ИМХО, воспользоваться методом section( const QString & sep, int start, int end = -1, SectionFlags flags = SectionDefault ) класса QString.


Название: вопрос по QRegExp
Отправлено: izoomer от Ноябрь 21, 2006, 11:19
ну а если по моему примеру (по моему более компактно), почему регексы не работают?

добавлено спустя 13 минут:

 не работают потому как надо в выражении регулярном откидывать знак перевода строки. Подскажите как откинуть конец строки в объекте QString .


Название: вопрос по QRegExp
Отправлено: Вудруф от Ноябрь 21, 2006, 12:19
Использование section потребует 2-х проходов строки. Предложеный мною способ - один.
Кроме того, в моём случае игнорируются пробелы перед и после числа.
При отсутствии пробелов код можно сократить до:
Код:

std::string::size_type idx = str.find ('%');
int x = std::atoi (str.substr (0, idx).c_str());
std::string text = str.substr (str.find (':', idx) + 1);


Название: вопрос по QRegExp
Отправлено: Sergeich от Ноябрь 21, 2006, 14:47
Код:
	QString source,value,text; 
source ="20%:in progress";
QRegExp exp("^([0-9]+)%:(.*)$");
if ( exp.indexIn(source) != -1 ) {
value=exp.cap(1);
text=exp.cap(2);
qDebug( "%s, %s", value.toLatin1(), text.toLatin1() );
}

Должно работать. Не используй stdout в качестве имени переменной, stdout - в стандартной библиотеке дескриптор файла!


Название: вопрос по QRegExp
Отправлено: izoomer от Ноябрь 21, 2006, 18:57
все таки лучше с регулярными выражениями.
Работает.Спасибо всем.