【问题标题】:QT regularExpressions retrieve numbersQT 正则表达式检索数字
【发布时间】:2018-03-02 14:26:30
【问题描述】:

我必须拆分“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=

怎么了?

【问题讨论】:

  • 您的主要问题是您只获得了一个匹配项。您需要获得 all 匹配项。不管有没有字母,这似乎不在这个问题的范围内。否则,请更新它。
  • 如果有解决您问题的答案,请考虑接受/支持。如果没有,请提供评论,说明什么不起作用/仍不清楚。

标签: qt qregularexpression


【解决方案1】:

您的正则表达式仅与re.match 匹配一次 1 个或多个数字。前两个值是第 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)得到整个匹配。

【讨论】:

    【解决方案2】:

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

    QString str("2323 432 1223");
    QStringList list = str.split(" ");
    for(int i = 0; i < list.length(); i++){
        qDebug() << list.at(i);
    }
    

    【讨论】:

    • 是的,但字符串的组成无关紧要,只要它除以您用作拆分函数参数的字符/字符串即可。
    • 如果我必须从诸如“234e 2143 gt4355”之类的行中重新检索,例如,234 3243 4355,而不是拆分,我得到3个QStrings,其值为234e,2143,gt4355,分开但仍然字母
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 2016-05-04
    相关资源
    最近更新 更多