我正在编写一个使用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);
}
有人能帮我吗?
发布于 2015-03-27 15:01:38
答案是您应该使用.globalMatch
方法而不是.match
。
关于这一点,请参见QRegularExpression文档:
尝试对给定的主题字符串执行正则表达式的全局匹配,从主题内的偏移位置开始,使用matchType类型的匹配并遵守给定的matchOptions。返回的QRegularExpressionMatchIterator位于第一个匹配结果之前(如果有的话)。
此外,您还可以删除QRegularExpression::MultilineOption
选项,因为它没有被使用。
样本代码:
QRegularExpressionMatchIterator i = exp.globalMatch(recv);
while (i.hasNext()) {
QRegularExpressionMatch match = i.next();
// ...
}
发布于 2017-11-03 06:34:23
实际上,我在谷歌上发现了类似的问题,但我不能完全同意答案,因为我认为大多数关于多行匹配与新QRegularExpression匹配的问题都可以这样回答:
使用允许(.)的QRegularExpression::DotMatchesEverythingOption选项以匹配换行符。它非常有用,然后从QRegExp移植。
发布于 2015-03-27 14:41:38
你得到了一个or
表达式,第一个表达式是真的,工作完成了。您需要拆分字符串并循环数组,以便与此表达式进行比较,我认为这是可行的。
如果数据每一次都具有相同的结构,则可以使用以下内容:
"(AUTH)-<([^>]+?)>-<([^>]+?)>\\nINFO-ID:(\\d+)\\n(REG)-<([^>]+?)>-<([^>]+?)>-<([^>]+?)>-<([^>]+?)>\\n(SEND)-ID:(\\d+)-DATE:(\\d+):(\\d+) (\\d+)/(\\d+)/(\\d+) <([^>]+?)>\\n(UPDATEN)-<([^>]+?)>\\n(UPDATES)-<([^>]+?)>"
21场比赛
https://stackoverflow.com/questions/29309383
复制