Russian Qt Forum

Qt => Общие вопросы => Тема начата: blood_shadow от Май 20, 2011, 16:34



Название: Заморочка с QRegExp'ами
Отправлено: blood_shadow от Май 20, 2011, 16:34
Добрый день,
кто может объяснить почему данный код не работает:
Код
C++ (Qt)
QString string("filename=\"arhi1.rar\"");
QRegExp onlyName_reg("([a-zA-Z\\d._]*)(?=\")");
 
int pos = QString("filename").length() + 1;
if ((pos = onlyName_reg.indexIn(string, pos)) != -1)
{
   QString fileName =
           onlyName_reg.cap();
 
   qDebug() << "File name -> " << fileName;
 
}
 

а этот работает:
Код
C++ (Qt)
QString string("filename=\"arhi1.rar\n");
QRegExp onlyName_reg("([a-zA-Z\\d._]*)(?=\n)");
 
int pos = QString("filename").length() + 1;
if ((pos = onlyName_reg.indexIn(string, pos)) != -1)
{
   QString fileName =
           onlyName_reg.cap();
 
   qDebug() << "File name -> " << fileName;
 
}
 

Первый выводит пустую строку, а второй arhi1.rar, как-то повидимому неправильно обрабатывается
\"


Название: Re: Заморочка с QRegExp'ами
Отправлено: kambala от Май 20, 2011, 17:14
пробовал эскейпить кавычку (в смысле реальную кавычку)?
Код
C++ (Qt)
QString string("filename=\\\"arhi1.rar\\\"");
QRegExp onlyName_reg("([a-zA-Z\\d._]*)(?=\\\")"); // возможно тут тоже нужно


Название: Re: Заморочка с QRegExp'ами
Отправлено: blood_shadow от Май 20, 2011, 17:26
пробовал эскейпить кавычку (в смысле реальную кавычку)?
только что попробовал три разных варианта с \\\" - результат тот же...
наверно это баг или есть какая-то не очевидная тонкость


Название: Re: Заморочка с QRegExp'ами
Отправлено: zenden от Май 20, 2011, 17:30
Это не баг, вместо * используйте +

Код
C++ (Qt)
QRegExp onlyName_reg("([a-zA-Z\\d._]+)(?=\")");


Название: Re: Заморочка с QRegExp'ами
Отправлено: kambala от Май 20, 2011, 17:34
а ведь действительно. мне почему-то показалось, что поиск начинается не с начальной кавычки, а с первой буквы имени файла (уже за этой кавычкой) - тогда б указанное в первом посте решение работало.


Название: Re: Заморочка с QRegExp'ами
Отправлено: blood_shadow от Май 20, 2011, 17:40
Это не баг, вместо * используйте +

Код
C++ (Qt)
QRegExp onlyName_reg("([a-zA-Z\\d._]+)(?=\")");
понял, в чем хитрость, спасибо