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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Регулярные выражения в Qt  (Прочитано 11094 раз)
l_a_m
Гость
« : Май 11, 2010, 09:14 »

Доброе время суток Ув. Коллеги!
Написал вот такую регулярку, для строки вида "someArg232 (not) in (val1, val2, ..., valX)" но столкнулся с проблемой - регулярное вырождение которое я написал, вытаскивает только лишь последнее число среди valX, можно ли каким либо способом в QRegExp выбрать не жадный алгоритм поиска и можно ли как либо исключить из вхождений некоторые скобки, если мне память не изменяет, в перловских регулярках, это делается при помощи знака $ после скобки, а в QRegExp, такой вариант вроде-бы не катит. :-)

совсем забыл, регулярное выражение собственно такое: "([\\w\\d]+)[ ]+((not[ ]+)?in)[ ]*\\([ ]*((\\d+)[, ]*)*\\)"

пока что сделал абы работало так:
Код:
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
functionIn_NotIn("select in (12, 14, 99, 231, 7)");

return a.exec();
}

void functionIn_NotIn(const QString &str)
{
QRegExp values("(\\d+)");
QRegExp argument("^([a-zA-Z_][a-zA-Z_0-9]*)");
QRegExp operators("[ ]*(in|not)[ ]*");

//QString str = "select in (12, 14, 99, 231, 7)";

QStringList listValues;
QStringList listArguments;
QStringList listOperators;

int pos = 0;
while ((pos = values.indexIn(str, pos)) != -1) {
listValues << values.cap(1);
pos += values.matchedLength();
}

pos = 0;
while ((pos = argument.indexIn(str, pos)) != -1) {
listArguments << argument.cap(1);
pos += argument.matchedLength();
}

pos = 0;
while ((pos = operators.indexIn(str, pos)) != -1) {
listOperators << operators.cap(1);
pos += operators.matchedLength();
}




cout<<"----------listArguments------------"<<endl;
for (int i=0;i<listArguments.count();i++)
{
cout<<listArguments.at(i).toStdString()<<endl;
}
cout<<"----------listValues------------"<<endl;
for (int i=0;i<listValues.count();i++)
{
cout<<listValues.at(i).toStdString()<<endl;
}
cout<<"----------listOperators------------"<<endl;
for (int i=0;i<listOperators.count();i++)
{
cout<<listOperators.at(i).toStdString()<<endl;
}
}
Но чувствую, что это попахивает (прошу простить)фигнёй, и есть вариант менее затратный.
« Последнее редактирование: Май 11, 2010, 10:31 от l_a_m » Записан
KADABRA
Гость
« Ответ #1 : Май 11, 2010, 11:38 »

Цитировать
столкнулся с проблемой - регулярное вырождение которое я написал, вытаскивает только лишь последнее число среди valX
При неизвестном числе вхождений такого одним регулярным выражением сделать невозможно.
http://doc.trolltech.com/4.6/qregexp.html нам об этом недвусмысленно говорит:
Цитировать
Some regexps can match an indeterminate number of times. For example if the input string is "Offsets: 12 14 99 231 7" and the regexp, rx, is (\d+)+, we would hope to get a list of all the numbers matched. However, after calling rx.indexIn(str), capturedTexts() will return the list ("12", "12"), i.e. the entire match was "12" and the first subexpression matched was "12". The correct approach is to use cap() in a loop.

Цитировать
пока что сделал абы работало так:
И правильно сделал.
Записан
crossly
Гость
« Ответ #2 : Май 11, 2010, 13:23 »

не жадный.... setMinimal(true)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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