QT regularExpressions retrieve numbers

2019-02-28 22:50发布

I've to split simple QStrings of the form "number number number",for example " 2323 432 1223". The code i use is

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;
}

if the first line being processed is like the example string i get for the first while cycle output:

1= 2323

2= 2323

3=

what is wrong?

2条回答
Luminary・发光体
2楼-- · 2019-02-28 23:23

Your regex only matches 1 or more digits once with re.match. The first two values are Group 0 (the whole match) and Group 1 value (the value captured with a capturing group #1). Since there is no second capturing group in your pattern, match.captured(2) is empty.

You must use QRegularExpressionMatchIterator to get all matches from the current string:

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

Note that (\\d+) contains an unnecessary capturing group, since the whole match can be accessed, too. So, you may use re("\\d+") and then get the whole match with i.next().captured(0).

查看更多
趁早两清
3楼-- · 2019-02-28 23:36

If the usage of regular expressions isn't mandatory, you could also use QString's split()-function.

QString str("2323 432 1223");
QStringList list = str.split(" ");
for(int i = 0; i < list.length(); i++){
    qDebug() << list.at(i);
}
查看更多
登录 后发表回答