3

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

有人能帮我吗?

4

3 回答 3

3

答案是你应该使用.globalMatchmethod 而不是.match.

请参阅QRegularExpression 文档

尝试对给定的主题字符串执行正则表达式的全局匹配,从主题内的偏移位置开始,使用 matchType 类型的匹配并遵守给定的 matchOptions。返回的 QRegularExpressionMatchIterator 位于第一个匹配结果(如果有)之前。

此外,您可以删除该QRegularExpression::MultilineOption选项,因为它没有被使用。

示例代码:

QRegularExpressionMatchIterator i = exp.globalMatch(recv);
while (i.hasNext()) {
    QRegularExpressionMatch match = i.next();
    // ...
}
于 2015-03-27T23:01:38.420 回答
2

实际上我用谷歌搜索了这个有类似问题的问题,但我不能完全同意答案,因为我认为大多数关于多行匹配与新 QRegularExpression 的问题可以回答如下:

使用 QRegularExpression::DotMatchesEverythingOption 选项,它允许 (.) 匹配换行符。然后从 QRegExp 移植非常有用

于 2017-11-03T14:34:23.350 回答
0

你有一个or表达式,第一个是真的,工作完成了。我认为你需要拆分字符串并循环数组以与此表达式进行比较。

如果数据每次都有相同的结构,你可以使用这样的东西:

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

21 场比赛

于 2015-03-27T22:41:38.177 回答