Я пишу программу, которая использует 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);
}
Кто-нибудь может мне помочь?
Ответ вы должны использовать .globalMatch
метод, а не .match
,
Увидеть QRegularExpression документация на что:
Попытки выполнить глобальное сопоставление регулярного выражения с
заданная строка темы, начиная со смещения позиции внутри
субъект, используя совпадение типа matchType и соблюдая данное
matchOptions. Возвращенный QRegularExpressionMatchIterator является
позиционируется перед первым результатом матча (если есть).
Также вы можете удалить QRegularExpression::MultilineOption
вариант, так как он не используется.
Образец кода:
QRegularExpressionMatchIterator i = exp.globalMatch(recv);
while (i.hasNext()) {
QRegularExpressionMatch match = i.next();
// ...
}
На самом деле у меня в этом вопросе Google возникла похожая проблема, но я не смог полностью согласиться с ответом, так как думаю, что на большинство вопросов о многострочном сопоставлении с новым QRegularExpression можно ответить следующим образом:
используйте опцию QRegularExpression :: DotMatchesEverythingOption, которая позволяет (.) сопоставлять символы новой строки. Что очень полезно, тогда портирование из QRegExp
ты получил or
Выражение и первое верно, работа сделана.
я думаю, вам нужно разделить строку и зациклить массив, чтобы сравнить с этим выражением.
Если данные каждый раз имеют одинаковую структуру, вы можете использовать что-то вроде этого:
"(AUTH)-<([^>]+?)>-<([^>]+?)>\\nINFO-ID:(\\d+)\\n(REG)-<([^>]+?)>-<([^>]+?)>-<([^>]+?)>-<([^>]+?)>\\n(SEND)-ID:(\\d+)-DATE:(\\d+):(\\d+) (\\d+)/(\\d+)/(\\d+) <([^>]+?)>\\n(UPDATEN)-<([^>]+?)>\\n(UPDATES)-<([^>]+?)>"
21 матчей