QRegExp 文件名但不匹配

QRegExp a filename but its not matching

我正在尝试从 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/

等工具

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

您的代码中存在以下错误:

  • 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()