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()
。
我正在尝试从 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()
。