Russian Qt Forum
Ноябрь 24, 2024, 07:01 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: вопрос по QRegExp  (Прочитано 5112 раз)
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
[/сщву]
выводит пустые места
что не так ?
Записан
Вудруф
Гость
« Ответ #1 : Ноябрь 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);

Можно гораздо локаничнее, но так (как мне кажется) получается эффективнее.
Записан
GqRun
Гость
« Ответ #2 : Ноябрь 21, 2006, 10:39 »

Проще всего, ИМХО, воспользоваться методом section( const QString & sep, int start, int end = -1, SectionFlags flags = SectionDefault ) класса QString.
Записан
izoomer
Гость
« Ответ #3 : Ноябрь 21, 2006, 11:19 »

ну а если по моему примеру (по моему более компактно), почему регексы не работают?

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

 не работают потому как надо в выражении регулярном откидывать знак перевода строки. Подскажите как откинуть конец строки в объекте QString .
Записан
Вудруф
Гость
« Ответ #4 : Ноябрь 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);
Записан
Sergeich
Гость
« Ответ #5 : Ноябрь 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 - в стандартной библиотеке дескриптор файла!
Записан
izoomer
Гость
« Ответ #6 : Ноябрь 21, 2006, 18:57 »

все таки лучше с регулярными выражениями.
Работает.Спасибо всем.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.209 секунд. Запросов: 21.