我正在编写一个使用QRegularExpression和MultilineOption的程序,我编写了这段代码,但在第一行匹配了stop。为什么?我在哪里做错了?
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);
}
有人可以帮助我吗?
答案 0 :(得分:2)
答案是你应该使用.globalMatch
方法而不是.match
。
请参阅QRegularExpression documentation:
尝试执行正则表达式的全局匹配 给定的主题字符串,从位于内部的位置偏移开始 subject,使用matchType类型的匹配并尊重给定的 matchOptions。返回的QRegularExpressionMatchIterator是 位于第一个匹配结果之前(如果有的话)。
此外,您可以删除QRegularExpression::MultilineOption
选项,因为它未被使用。
示例代码:
QRegularExpressionMatchIterator i = exp.globalMatch(recv);
while (i.hasNext()) {
QRegularExpressionMatch match = i.next();
// ...
}
答案 1 :(得分:1)
实际上我在这个问题上有类似的问题,但我完全不同意答案,因为我认为大多数关于多线匹配新QRegularExpression的问题可以回答如下:
使用QRegularExpression :: DotMatchesEverythingOption选项,允许(。)匹配换行符。这对从QRegExp
移植来说非常有用答案 2 :(得分:0)
你得到一个or
表达式,第一个表达式是真的,工作完成了。
你需要拆分字符串并循环数组以与这个表达式进行比较我认为。
如果数据每次都具有相同的结构,您可以使用以下内容:
"(AUTH)-<([^>]+?)>-<([^>]+?)>\\nINFO-ID:(\\d+)\\n(REG)-<([^>]+?)>-<([^>]+?)>-<([^>]+?)>-<([^>]+?)>\\n(SEND)-ID:(\\d+)-DATE:(\\d+):(\\d+) (\\d+)/(\\d+)/(\\d+) <([^>]+?)>\\n(UPDATEN)-<([^>]+?)>\\n(UPDATES)-<([^>]+?)>"
21匹配