【问题标题】:QRegExp a filename but its not matchingQRegExp 一个文件名,但它不匹配
【发布时间】:2022-01-13 18:47:30
【问题描述】:

我正在尝试从 PNG 文件中解析日期时间,但无法通过 QRegExp 得到它

this_png_20211208_1916.png

  QDateTime Product::GetObstime()
    {
       QDateTime obstime;
       QString filename = FLAGS_file_name.c_str();
       QString year, month, day, hour, minute, second;


   QRegExp regexp = QRegExp("^.*\\w+_(\\d{4}\\d{2}\\d{2})_(\\d{2}\\d{2})\\.png$");

   VLOG(3) << " filename: " << filename.toStdString();
   if(regexp.indexIn(filename) !=-1)
   {
       VLOG(3) << " filename: " << filename.toStdString();
       QStringList dt_bits = regexp.capturedTexts();
       if(dt_bits.size() >=2)
       {
           year = dt_bits.at(1).mid(0, 4);
           month = dt_bits.at(1).mid(5, 2);
           day = dt_bits.at(1).mid(8, 2);

           hour = dt_bits.at(2).mid(0, 2);
           minute = dt_bits.at(2).mid(3, 2);
           second = dt_bits.at(2).mid(3, 2);
           VLOG(3) << " Year: " << year.toStdString()
                   << " Month: " << month.toStdString()
                   << " Day: " << day.toStdString()
                   << " Hour: " << hour.toStdString()
                   << " Min: " << minute.toStdString()
                   << " Sec: " << second.toStdString();
           QString datetime_str = year + "-" + month + "-" + day +
                   "T" + hour + ":" + minute + second + "00Z";

           obstime = QDateTime::fromString(datetime_str, Qt::ISODate);
           if (obstime.isValid())
           {
               VLOG(3)<<"Date iS VALID: "<<obstime.toString(Qt::ISODate).toStdString();
           }
           else
           {
               LOG(ERROR)<<" Error! Date Time bits did not match format.";
           }
       }

   }
   return obstime;
}

一直在使用https://regex101.com/等工具

但无济于事。我错过了什么吗?

【问题讨论】:

    标签: c++ qt parsing qregexp


    【解决方案1】:

    您的代码中有以下错误:

    • month = dt_bits.at(1).mid(5, 2); 应该是 month = dt_bits.at(1).mid(4, 2);,因为索引是从 0 开始的,而不是从 1 开始的
    • day = dt_bits.at(1).mid(8, 2); 应该是 day = dt_bits.at(1).mid(6, 2);
    • minute = dt_bits.at(2).mid(3, 2); 应该是 minute = dt_bits.at(2).mid(2, 2);
    • second = dt_bits.at(2).mid(3, 2); 应该是 second = "00";,因为您的文件名不包含秒数

    一般来说,我建议在正则表达式中完成所有工作,而不是使用 QString::mid() 进行一些花哨的拆分:

    QRegExp regexp = QRegExp("^.*\\w+_(\\d{4})(\\d{2})(\\d{2})_(\\d{2})(\\d{2})\\.png$");
    

    这为您提供了单独分组中的所有字段,根本不需要QString::mid()

    【讨论】:

    • 这成功了!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多