1

我必须拆分“number number number”形式的简单QStrings,例如“2323 432 1223”。我使用的代码是

QString line;
QRegularExpression re("(\\d+)");
QRegularExpressionMatch match;

while(!qtextstream.atEnd()){
     line = qtextstream.readLine();
     match = re.match(line);
     std::cout<<"1= "<<match.captured(0).toUtf8().constData()<<std::endl;
     std::cout<<"2= "<<match.captured(1).toUtf8().constData()<<std::endl;
     std::cout<<"3= "<<match.captured(2).toUtf8().constData()<<std::endl;
}

如果正在处理的第一行就像我在第一个 while 循环输出中得到的示例字符串:

1= 2323

2= 2323

3=

怎么了?

4

2 回答 2

2

您的正则表达式仅与 1 个或多个数字匹配一次re.match前两个值是第 0 组(整个匹配)和第 1 组值(使用捕获组 #1 捕获的值)由于您的模式中没有第二个捕获组,match.captured(2)因此为空。

您必须使用QRegularExpressionMatchIterator从当前字符串中获取所有匹配项:

QRegularExpressionMatchIterator i = re.globalMatch(line);
while (i.hasNext()) {
    qDebug() << i.next().captured(1); // or i.next().captured(0) to see the whole match
}

请注意,它(\\d+)包含一个不必要的捕获组,因为也可以访问整个匹配项。因此,您可以使用re("\\d+"),然后使用i.next().captured(0).

于 2017-09-21T09:41:45.193 回答
0

如果不强制使用正则表达式,您也可以使用 QString 的split()-function.

QString str("2323 432 1223");
QStringList list = str.split(" ");
for(int i = 0; i < list.length(); i++){
    qDebug() << list.at(i);
}
于 2017-09-21T13:09:33.200 回答