【QT】获取文件路径中的文件名,去掉后缀,然后提取文件名中的数字

目录

[1. 获取文件路径中的文件名,去掉后缀,然后提取文件名中的数字](#1. 获取文件路径中的文件名,去掉后缀,然后提取文件名中的数字)

方法一:使用QFileInfo和正则表达式

方法二:使用QString的字符串操作

方法三:提取特定格式的数字(如日期)

注意事项

2.在QT中判断字符串是否以数字结尾并获取数字

方法一:使用QChar遍历(适合简单情况)

方法二:使用正则表达式(更灵活)

方法三:处理文件名(先去掉扩展名)

方法四:仅检查最后一位是否是数字

性能比较

完整示例


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() << "未找到符合格式的日期";
    }
}

注意事项

  1. 路径分隔符:QT会自动处理不同操作系统下的路径分隔符(/或\)

  2. 多个数字:方法一会提取所有连续的数字,方法二会将所有数字合并

  3. 性能考虑:对于简单需求,方法二的字符串操作更高效;复杂匹配建议使用方法一的正则表达式

  4. 文件名格式:如果文件名有固定格式(如"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

性能比较

  1. QChar遍历:最快,适合简单需求

  2. 正则表达式:最灵活,可处理复杂模式

  3. 文件名处理:需要额外步骤但更准确

完整示例

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();
}

选择建议:

  • 只需快速检查 → 方法四

  • 需要提取数字 → 方法一或二

  • 处理文件名 → 方法三

相关推荐
杨云龙UP18 小时前
生产环境MySQL多实例XtraBackup全量备份与rsync异地自动传输实践
linux·运维·数据库·mysql·xtrabackup·主从复制·备份恢复
熊文豪19 小时前
SQLServer数据迁移之后,那张报表还能不能秒出
数据库·sqlserver·电科金仓
JosieBook19 小时前
【数据库】把数据优势转化为决策优势:TimechoAI时序大模型使用解析
数据库
鸿芯微控科技19 小时前
压电点胶阀出胶量不稳定怎么排查?驱动波形、背压、点胶重量与Python分析
开发语言·python·压电点胶阀·精密点胶·点胶重量·流体控制
原野池予19 小时前
深入Java集合框架:HashMap源码解析(JDK 8)
java·开发语言
测试运维日常笔记19 小时前
VMware vSphere、ESXi 与 vCenter Server:核心概念与关系详解
java·开发语言
会编程的吕洞宾19 小时前
MySQL 慢查询从5秒到50毫秒:索引失效六大场景定位与实战调优
数据库·mysql
浅念-19 小时前
MySQL 索引底层完整详解|磁盘Page|B+树推导|聚簇非聚簇索引|索引SQL操作
大数据·数据库·b树·sql·mysql·面试·职场和发展
m0_5474866620 小时前
《面向对象与Java程序设计》全套PPT课件2026
java·开发语言
小马过河R20 小时前
数据仓库入门:是什么、怎么做、和数据库有什么区别?
大数据·数据库·数据仓库·架构·驾驭工程·fde