Доброе время суток Ув. Коллеги!
Написал вот такую регулярку, для строки вида "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;
}
}
Но чувствую, что это попахивает (прошу простить)фигнёй, и есть вариант менее затратный.