Qt Использование многострочной опции QRegularExpression

Я пишу программу, которая использует QRegularExpression и MultilineOption, я написал этот код, но сопоставление останавливается на первой строке. Зачем? Где я делаю не так?

QString recv = "AUTH-<username>-<password>\nINFO-ID:45\nREG-<username>-<password>-<name>-<status>\nSEND-ID:195-DATE:12:30 2/02/2015 <esempio>\nUPDATEN-<newname>\nUPDATES-<newstatus>\n";

QRegularExpression exp = QRegularExpression("(SEND)-ID:(\\d{1,4})-DATE:(\\d{1,2}):(\\d) (\\d{1,2})\/(\\d)\/(\\d{2,4}) <(.+)>\\n|(AUTH)-<(.+)>-<(.+)>\\n|(INFO)-ID:(\\d{1,4})\\n|(REG)-<(.+)>-<(.+)>-<(.+)>-<(.+)>\\n|(UPDATEN)-<(.+)>\\n|(UPDATES)-<(.+)>\\n", QRegularExpression::MultilineOption);

qDebug() << exp.pattern();

QRegularExpressionMatch match = exp.match(recv);
qDebug() << match.lastCapturedIndex();
for (int i = 0; i <= match.lastCapturedIndex(); ++i) {
qDebug() << match.captured(i);
}

Кто-нибудь может мне помочь?

2

Решение

Ответ вы должны использовать .globalMatch метод, а не .match,

Увидеть QRegularExpression документация на что:

Попытки выполнить глобальное сопоставление регулярного выражения с
заданная строка темы, начиная со смещения позиции внутри
субъект, используя совпадение типа matchType и соблюдая данное
matchOptions. Возвращенный QRegularExpressionMatchIterator является
позиционируется перед первым результатом матча (если есть).

Также вы можете удалить QRegularExpression::MultilineOption вариант, так как он не используется.

Образец кода:

QRegularExpressionMatchIterator i = exp.globalMatch(recv);
while (i.hasNext()) {
QRegularExpressionMatch match = i.next();
// ...
}
2

Другие решения

На самом деле у меня в этом вопросе Google возникла похожая проблема, но я не смог полностью согласиться с ответом, так как думаю, что на большинство вопросов о многострочном сопоставлении с новым QRegularExpression можно ответить следующим образом:

используйте опцию QRegularExpression :: DotMatchesEverythingOption, которая позволяет (.) сопоставлять символы новой строки. Что очень полезно, тогда портирование из QRegExp

1

ты получил or Выражение и первое верно, работа сделана.
я думаю, вам нужно разделить строку и зациклить массив, чтобы сравнить с этим выражением.

Если данные каждый раз имеют одинаковую структуру, вы можете использовать что-то вроде этого:

"(AUTH)-<([^>]+?)>-<([^>]+?)>\\nINFO-ID:(\\d+)\\n(REG)-<([^>]+?)>-<([^>]+?)>-<([^>]+?)>-<([^>]+?)>\\n(SEND)-ID:(\\d+)-DATE:(\\d+):(\\d+) (\\d+)/(\\d+)/(\\d+) <([^>]+?)>\\n(UPDATEN)-<([^>]+?)>\\n(UPDATES)-<([^>]+?)>"

21 матчей

0
По вопросам рекламы [email protected]