目录
[1. 获取文件路径中的文件名,去掉后缀,然后提取文件名中的数字](#1. 获取文件路径中的文件名,去掉后缀,然后提取文件名中的数字)
1. 获取文件路径中的文件名,去掉后缀,然后提取文件名中的数字
方法一:使用QFileInfo和正则表达式
cpp
#include <QFileInfo>
#include <QRegularExpression>
#include <QDebug>
void extractNumbersFromFilename(const QString& filePath) {
// 1. 获取文件名(不带路径)
QFileInfo fileInfo(filePath);
QString fileName = fileInfo.fileName();
// 2. 去掉文件扩展名
QString baseName = fileInfo.baseName();
// 3. 提取文件名中的数字
QRegularExpression re("(\\d+)");
QRegularExpressionMatchIterator i = re.globalMatch(baseName);
qDebug() << "原始路径:" << filePath;
qDebug() << "文件名:" << fileName;
qDebug() << "去掉后缀:" << baseName;
qDebug() << "包含的数字:";
while (i.hasNext()) {
QRegularExpressionMatch match = i.next();
QString numberStr = match.captured(1);
qDebug() << numberStr;
}
}
// 使用示例
extractNumbersFromFilename("C:/path/to/file/test123_456file.txt");
方法二:使用QString的字符串操作
cpp
#include <QFileInfo>
#include <QDebug>
void extractNumbersFromFilenameSimple(const QString& filePath) {
// 1. 获取文件名(不带路径和后缀)
QFileInfo fileInfo(filePath);
QString baseName = fileInfo.baseName();
// 2. 提取数字
QString numbers;
for (const QChar& ch : baseName) {
if (ch.isDigit()) {
numbers.append(ch);
}
}
qDebug() << "原始路径:" << filePath;
qDebug() << "去掉后缀的文件名:" << baseName;
qDebug() << "提取的数字:" << numbers;
}
// 使用示例
extractNumbersFromFilenameSimple("C:/path/to/file/image20230415.jpg");
方法三:提取特定格式的数字(如日期)
如果需要提取特定格式的数字(如YYYYMMDD日期),可以使用更精确的正则表达式:
cpp
void extractDateFromFilename(const QString& filePath) {
QFileInfo fileInfo(filePath);
QString baseName = fileInfo.baseName();
// 匹配8位连续数字(如20230415)
QRegularExpression re("(\\d{8})");
QRegularExpressionMatch match = re.match(baseName);
if (match.hasMatch()) {
QString dateStr = match.captured(1);
qDebug() << "找到日期:" << dateStr;
} else {
qDebug() << "未找到符合格式的日期";
}
}
注意事项
-
路径分隔符:QT会自动处理不同操作系统下的路径分隔符(/或\)
-
多个数字:方法一会提取所有连续的数字,方法二会将所有数字合并
-
性能考虑:对于简单需求,方法二的字符串操作更高效;复杂匹配建议使用方法一的正则表达式
-
文件名格式:如果文件名有固定格式(如"report_2023_04.txt"),可以调整正则表达式更精确匹配
选择哪种方法取决于你的具体需求:
-
需要提取所有数字 → 方法一
-
只需要合并所有数字 → 方法二
-
需要特定格式的数字 → 方法三
2.在QT中判断字符串是否以数字结尾并获取数字
方法一:使用QChar遍历(适合简单情况)
cpp
#include <QString>
#include <QDebug>
// 判断是否以数字结尾并获取数字
QPair<bool, QString> getEndingDigits(const QString& str) {
if (str.isEmpty()) return qMakePair(false, QString());
QString digits;
for (int i = str.length() - 1; i >= 0; --i) {
if (str[i].isDigit()) {
digits.prepend(str[i]);
} else {
break;
}
}
return qMakePair(!digits.isEmpty(), digits);
}
// 使用示例
auto result = getEndingDigits("file123");
if (result.first) {
qDebug() << "以数字结尾,数字是:" << result.second; // 输出 "123"
} else {
qDebug() << "不以数字结尾";
}
方法二:使用正则表达式(更灵活)
cpp
#include <QRegularExpression>
QPair<bool, QString> getEndingDigitsRegex(const QString& str) {
QRegularExpression re("(\\d+)$");
QRegularExpressionMatch match = re.match(str);
if (match.hasMatch()) {
return qMakePair(true, match.captured(1));
}
return qMakePair(false, QString());
}
// 使用示例
auto result = getEndingDigitsRegex("image2023");
if (result.first) {
qDebug() << "匹配到结尾数字:" << result.second; // 输出 "2023"
}
方法三:处理文件名(先去掉扩展名)
cpp
#include <QFileInfo>
QPair<bool, QString> getFilenameEndingDigits(const QString& filePath) {
QFileInfo fi(filePath);
QString baseName = fi.baseName();
return getEndingDigitsRegex(baseName); // 使用方法二的正则
}
// 使用示例
auto result = getFilenameEndingDigits("/path/to/document123.pdf");
if (result.first) {
qDebug() << "文件名以数字结尾:" << result.second; // 输出 "123"
}
方法四:仅检查最后一位是否是数字
如果只需要检查最后一位是否是数字(不提取连续数字):
cpp
bool isLastCharDigit(const QString& str) {
return !str.isEmpty() && str.back().isDigit();
}
// 使用示例
qDebug() << isLastCharDigit("test1"); // true
qDebug() << isLastCharDigit("1test"); // false
性能比较
-
QChar遍历:最快,适合简单需求
-
正则表达式:最灵活,可处理复杂模式
-
文件名处理:需要额外步骤但更准确
完整示例
cpp
#include <QCoreApplication>
#include <QString>
#include <QDebug>
#include <QRegularExpression>
#include <QFileInfo>
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
QString test1 = "file123";
QString test2 = "123file";
QString test3 = "/path/to/image2023.jpg";
// 方法一
auto result1 = getEndingDigits(test1);
qDebug() << test1 << ":" << result1;
// 方法二
auto result2 = getEndingDigitsRegex(test2);
qDebug() << test2 << ":" << result2;
// 方法三
auto result3 = getFilenameEndingDigits(test3);
qDebug() << test3 << ":" << result3;
return a.exec();
}
选择建议:
-
只需快速检查 → 方法四
-
需要提取数字 → 方法一或二
-
处理文件名 → 方法三