2013-10-14 2 views
2

Я работаю над терминальной программой для выполнения приложений на удаленных машинах. вы можете передать команду как в cmd.exe окна, как:RegExp, чтобы найти аргументы командной строки

"C:\random Directory\datApplication.py" "validate" -r /c "C:\anotherDirectory" 

, чтобы сделать это возможным я иметь дело с цитируемым текстом и разобрать команду и ее аргументы из этой строки. в блокноте ++ Я нашел RegExp для их исправления (([^" \t\n]+)|("[^"]*"))+ и он работает. в Qt4.8.1 я пробовал:

static const QRegExp re("(([^\" \\t\\n]+)|(\"[^\"]*\"))+"); 
re.matchExact(str); // str is something like shown above 
qDebug() << re.capturedTexts(); 

и этот код печатает только мне 3 раза "C:\random Directory\datApplication.py" и ничего более. он должен распечатывать каждый аргумент, введенный как один объект ...

Что я могу сделать, чтобы заставить его работать?

РЕШЕНИЕ: (спасибо Lindrian)

const QString testText = "\"C:\\random Directory\\datApplication.py\" \"validate\" -r /c \"C:\\anotherDirectory\""; 
static const QRegExp re("([^\" \\t\\n]+|\"[^\"]*\")+"); 
int pos = 0; 
while ((pos = re.indexIn(testText)) != -1) //-i indicates that nothing is found 
{ 
    const int len = re.matchedLength(); 
    qDebug() << testText.mid(pos,len); 
    pos += len; 
} 

ответ

3

FTFY: ([^" \t\n]+|"[^"]*")

(Вы были просто злоупотребляют backrefs)

Убедитесь, что вы захватить все результаты.

Демо: http://regex101.com/r/pR8oF5

+0

спасибо за ваш быстрый ответ. должен был также изменить код qt, чтобы правильно найти совпадения. awesome link btw, помогает понять многое (и как кровавый новичок для регулярного выражения, я могу его использовать);) – Zaiborg