2016-04-29 2 views
1

Я хочу, чтобы отфильтровать ${...} с QRegExp, таким образом, что он Retuns в QStringList всех выбранных элементов:Текст фильтра с QRegExp

"$ {NAME}" < < "$ {DAY}" < < "$ {MEH}" < < "$ {MEH}" < < "$ {MEH}"

но почему-то не работает:

QString text = "Hello ${NAME} \ 
     How is your ${DAY} so? \ 
     Bye, ${MEH} ${MEH}\ 
     ${MEH}"; 

// Regex: /(\${.*})/g 
QRegExp rx("/(\\${.*})/g"); 
QStringList list; 
int pos = 0; 

while ((pos = rx.indexIn(text, pos)) != -1) { 
    QString val = rx.cap(1); 
    list << val; 
    qDebug() << "Val: " << val; 
    pos += rx.matchedLength(); 
} 

Нет вывода вообще? Что я делаю неправильно?

Update:

QRegularExpression работает, но только на каждой линии, а не на въезде уровне. Идеи?

QString text = "Hello ${NAME} \ 
     How is your ${DAY} so? \ 
     Bye, ${MEH} ${MEH}\ 
     ${MEH}"; 

QRegularExpression rx("(\\${.*})"); 
QRegularExpressionMatchIterator i = rx.globalMatch(text); 
while (i.hasNext()) { 
    QRegularExpressionMatch match = i.next(); 
    qDebug() << "Value: " << match.captured(0); 
} 

Выход:

Значение: «$ {NAME} \ т \ т \ Сбрось ваши $ {DAY} так \ т \ т \ tBye, $ {MEH} $ {MEH } \ т \ т \ т $ {MEH}»

+0

QRegExp rx ("/(\\\\${.*})/ g"); не работает – dasskorpion

+0

oops yeah, вы правы, чтобы соответствовать обратной косой чертой. –

+0

вы можете попробовать «QRegularExpression», если используете Qt5. Это perl-совместимый, в то время как 'QRegExp' - нет. Я также не уверен, что /.../g собирается делать то, что вы думаете в Qt. «QRegularExpression» включает функцию «globalMatch». –

ответ

1

Изменить регулярное выражение для QRegularExpression rx("(\\${.*?})");

Ваша первая попытка не работает, потому что QRegExp не поддерживает глобальное согласование через /.../g, и в целом, не perl-c ompliant. В Qt5 вам лучше использовать значительно улучшенный QRegularExpression.

Ваша вторая попытка не сработала, потому что ваше регулярное выражение слишком жадно. Он захватывает открытую фигурную скобу { до последняя закрывающая фигурная скобка }.

Если вы добавите вопросительный знак к захвату .*, вы отключите жадность, и в этом случае он будет захватывать только то, что вы ищете.

Будьте осторожны, пытаясь масштабировать это решение гораздо дальше. В общем, Regular expressions are not parsers.

Смежные вопросы