Russian Qt Forum

Qt => Общие вопросы => Тема начата: l_a_m от Май 11, 2010, 09:14



Название: Регулярные выражения в Qt
Отправлено: 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;
}
}
Но чувствую, что это попахивает (прошу простить)фигнёй, и есть вариант менее затратный.


Название: Re: Регулярные выражения в Qt
Отправлено: KADABRA от Май 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.

Цитировать
пока что сделал абы работало так:
И правильно сделал.


Название: Re: Регулярные выражения в Qt
Отправлено: crossly от Май 11, 2010, 13:23
не жадный.... setMinimal(true)