Qt使用QRegularExpression多行选项

时间:2015-03-27 20:09:49

标签: c++ regex qt qregularexpression

我正在编写一个使用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);
}

有人可以帮助我吗?

3 个答案:

答案 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匹配