第三篇:跨平台QT开发-正则表达式和文件处理

正则表达式

正则表达式即一个文本匹配字符串的一种模式,Qt 中 QRegExp 类实现使用正则表达式
进行模式匹配,且完全支持 Unicode,主要应用:字符串验证、搜索、查找替换、分割。
正则表达式中字符及字符集  
元素含义
c
匹配字符本身,如 a 匹配 a
\c
跟在\后面的字符匹配字符本身,但本表中下面指定的这些字符除外。
\a
匹配 ASCII 的振铃
\f
匹配 ASCII 的换页
\n
匹配 ASCII 的换行
\r
匹配 ASCII 的回车
\t
匹配 ASCII 的水平制表符
\v
匹配 ASCII 的垂直制表符
\xhhhh
匹配 Unicode 字符对应的十六进制数
\0ooo
匹配八进制的 ASCII/Latin1 字符
.
匹配任意字符
\d
匹配任意一个数字
\D
匹配一个非数字
\s
匹配一个空白字符,包括“\t”、“\n”、“\v”、“\f”、“\r”及“”
\S
匹配一个非空白字符
\w
匹配一个单词字符,包括任意字符数字下划线,即 A~Z,a~z,0~9 中任意一个
\W
匹配一个非单词字符
\n
第 n 个反向引用
量词含义
E?
匹配 0 次或 1 次等价于 E{0,1}
E+
匹配 1 次或多次,等价于 E{1,}
E*
匹配 0 次或多次,等价于 E{0,}
E{n}
匹配 n 次
E{n,}
匹配至少 n 次
E{,m}
匹配至多 m 次
E{n,m}
匹配至少 n 次,至多 m 次
断言含义
^
标志字符串的开始。若匹配“^”则使用“\\^”
$
标志字符串的结尾。若匹配“$”则使用“\\$”
\b
一个单词的边界( 匹配的就是边界内的单词为一个整体 )
\B
一个非单词的边界。当\b 为 false 则它为 true
(?=E)
表达式后紧跟 E 才匹配
(?!E)
表达式后不跟 E 才匹配
通配符
含义
c任意一个字符,表字符本身
任意一个字符,类似 regexp 中“.”
*
任意 0 个或多个字符
[...]
在[]中的字符集

QRegExp reg("ab");
    qDebug() << "匹配字符串本身";
    qDebug() << reg.exactMatch("abc");
    qDebug() << reg.exactMatch("ab");
    QRegExp reg0("(\\d*\\.\\D{2})");
    qDebug() << "匹配数字" << reg0.exactMatch("195.cm") << reg0.exactMatch("cm");
    //设置匹配语法
    QRegExp reg1("*.txt");
    reg1.setPatternSyntax(QRegExp::Wildcard); //支持通配符
    qDebug() << "支持通配符: " << reg1.exactMatch("当前hi.txt") << reg1.exactMatch(".txt");
    //匹配单词边界
    QRegExp reg2;
    reg2.setPattern("\\b(hello|word)\\b");
    qDebug() << "匹配到的单词的起始位置(以单词为单位):" << reg2.indexIn(" hello")
             << reg2.indexIn("wdf");
    QRegExp reg3("(\\d+)(?:\\s*)(cm|icn)");
    int index = reg3.indexIn("YaoMing 222 cm");
    if (index > -1) {
        qDebug() << "文本捕获:" << reg3.cap(0) << "cap(1): " << reg3.cap(1)
                 << "cap(2): " << reg3.cap(2);
    }
    QRegExp reg4("面(?!包)"); //(?!):不紧跟才匹配
    QString str = "吃面包,面包使用面粉做的,面粉可以做面食物";
    qDebug() << str;
    str.replace(reg4, "薯条");
    qDebug() << str; 

QRegularExpression regexp("hello");
    qDebug() << "QRegularExpression匹配字符" << regexp.match("hellow");
    regexp.setPatternOptions(QRegularExpression::CaseInsensitiveOption);
    qDebug() << "QRegularExpression使用大小写不敏感之后匹配字符" << regexp.match("Hellow");
    QRegularExpression qData("^(\\d\\d)/(\\d\\d)/(\\d\\d\\d\\d)$");
    QRegularExpressionMatch mach = qData.match("01/01/2024");
    QString mach0 = mach.captured(0);
    QString day = mach.captured(1);
    QString month = mach.captured(2);
    QString year = mach.captured(3);
    if (mach.hasMatch()) {
        qDebug() << "捕获的文本:" << mach0 << "天: " << day << "月: " << month << "年: " << year;
    }
    QString setPatten;
    setPatten = "^(Jan|Fei|Mar|Apr|May) \\d\\d \\d\\d\\d\\d";
    QRegularExpression Qdata(setPatten); //将字符串作为正则表达式

    QRegularExpressionMatch mach2
        = Qdata.match("Jan 01", 0, QRegularExpression::PartialPreferCompleteMatch); //部分匹配
    if (mach2.hasPartialMatch()) {
        qDebug() << mach2.hasMatch() << mach2.hasPartialMatch();
    }

 

 文件处理

QFile 类用于文件操作,它提供了读写文件的接口,可以读写文件、二进制文件和 Qt 资源文件。 处理文本文件和二进制文件, 可以使用 QTextStream 类和 QDataStream 类 。处理临时文件可以使用 QTemporaryFile, 获取信息可以使用 QFileInfo,处理目录可以使用 QDir ,监视文件和目录变化可以使用 QFileSystemWatcher.

QTextStream 的流操作符 

操作符
作用描述
bin
设置读写的整数为 二进制数
oct
设置读写的整数为 八进制数
dec
设置读写的整数为十进制数
hex
设置读写的整数为十六进制数
showbase
强制显示进制前缀,如十六进制(0x)、八进制(0)、二进制(0b)
forcesign
强制显示符号(+、-)
forcepoint
强制显示小数点
noshowbase
强制不显示前缀
noforcesign
强制不显示符号
uppercasebase
显示大写的进制前缀
lowercasebase
显示小些的进制前缀
uppercasedigits
用大写字母表示
lowercasedigits
用小写字母表示
fixed
固定小数点表示
scientific
科学计数法表示
left
左对齐
right
右对齐
center
居中
endl
换行
flush
清除缓冲

#include "QDataStream"
#include "QDate"
#include "QDebug"
#include "QFile" 

   QFile file;
    file.setFileName("user.txt");
    //读取文件
    if (file.open(QIODevice::ReadOnly)) {
        char buff[100];
        qint32 n;
        n = file.readLine(buff, sizeof(buff));
        if (n != -1) {
            qDebug() << "长度: " << n << "内容: " << buff;
            file.close();
        }
    } else {
        qDebug() << file.errorString();
    }
    //文件写入
    double dPI = 3.14159;
    int age = 32;
    QFile file1;
    file1.setFileName("data.txt");
    if (file1.open(QIODevice::WriteOnly | QIODevice::Truncate)) { //覆盖
        QTextStream out(&file1);
        out << QString("PI: ") << qSetRealNumberPrecision(3) << right << qSetFieldWidth(10) << dPI
            << endl
            << bin << qSetFieldWidth(10) << left << age;
    }
    file1.close();
    //二进制文件读写
    QFile bininfo;
    bininfo.setFileName("info.bat");
    if (bininfo.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
        QDataStream out(&bininfo);
        out << QString("文博波") << QDate::fromString("2024-01-25", "yyyy-MM-dd") << (qint32) 25;
    }
    bininfo.close();
    if (bininfo.open(QIODevice::ReadOnly)) {
        QDataStream in(&bininfo);
        QString name;
        QDate time;
        qint32 age;
        in >> name >> time >> age;
        qDebug() << name << time << age;
    }

获取文件信息 

 #include "QDateTime"
#include "QFileDialog"

 

void Widget::infoFile(QString &filename)
{
    QFileInfo info(filename);
    qint64 size = info.size();
    QDateTime createTime = info.created();
    QDateTime modifyTime = info.lastModified();
    QDateTime readTime = info.lastRead();

    bool isDic = info.isFile();
    bool isDir = info.isDir();
    bool isSym = info.isSymLink();
    bool isread = info.isReadable();
    bool isWrite = info.isWritable();
    bool isHidden = info.isHidden();
    bool isExcu = info.isExecutable();
    ui->CreateTimeLineEdit->setText(createTime.toString());
    ui->DicSizeLineEdit->setText(QString::number(size));
    ui->LastReadLineEdit->setText(readTime.toString());
    ui->LastModifyLineEdit->setText(modifyTime.toString());

    //设置属性按钮
    ui->xad->setChecked(isDic);
    ui->xal->setChecked(isSym);
    ui->xah->setChecked(isHidden);
    ui->xar->setChecked(isread);
    ui->xaw->setChecked(isWrite);
    ui->xae->setChecked(isExcu);
    ui->xaf->setChecked(isDir);
}

void Widget::on_DicFileBtn_clicked()
{
    //获取文件
    // QString filename = QFileDialog::getOpenFileName(this,
    //                                                 "打开文件",
    //                                                 "./",
    //                                                 "C++(*.cpp);;"

    //                                                 "C  (*.c);;"
    //                                                 "Head file(*.h)");
    //获取文件夹
    QString filename = QFileDialog::getExistingDirectory(this, "获取文件", "./");
    ui->DicFilelineEdit->setText(filename);
    infoFile(filename); //把参数传出去

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/376348.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mac电脑快捷指令实现拼图

mac访达&#xff0c;搜索输入‘快捷指令’&#xff0c;找到‘快捷指令’&#xff0c; 点击快捷指令&#xff0c;进入快捷指令中心&#xff0c;搜索‘拼图’ &#xff0c;选中‘照片拼图’&#xff0c; 点击‘添加快捷指令’&#xff0c; 在‘所有快捷键指令’中可以看到添加的快…

C++ || 模板初阶 | 函数模板 | 类模板

泛型编程 泛型编程&#xff0c;编写与类型无关的通用代码&#xff0c;是代码复用的一种手段。模板是泛型编程的基础。 可以理解为活字印刷术类似的方式。 函数模板 函数模板概念 函数模板&#xff0c;代表一个函数家族&#xff0c;该函数模板与类型无关&#xff0c;在使用…

Python调用matlab程序

matlab官网&#xff1a;https://ww2.mathworks.cn/?s_tidgn_logo matlab外部语言和库接口&#xff0c;包括 Python、Java、C、C、.NET 和 Web 服务。 matlab和python的版本 安装依赖配置 安装matlab的engine 找到matlab的安装目录&#xff1a;“xxx\ extern\engines\python…

Linux的进程信号

注意&#xff1a;首先需要提醒一个事情&#xff0c;本节提及的进程信号和下节的信号量没有任何关系&#xff0c;请您区分对待。 1.信号概念 1.1.生活中的信号 我们在生活中通过体验现实&#xff0c;记忆了一些信号和对应的处理动作&#xff0c;这意味着信号有以下相关的特点&…

重生奇迹mu仙踪林npc

工匠尤达 NPC工匠尤达位于仙踪林的坐标为(87, 134)&#xff0c;他可以给玩家制作装备和强化装备。 精灵安吉拉 NPC精灵安吉拉位于仙踪林的坐标为(29, 196)&#xff0c;她可以给玩家提供补血、补魔服务&#xff0c;同时也能提供提高属性点数的服务。 仓库使者塞维特 NPC仓库…

SpringCloud-创建多模块项目

在微服务架构中&#xff0c;项目的组织结构对于代码的维护和团队的协作至关重要。Spring Cloud作为一个强大的微服务框架&#xff0c;提供了丰富的功能和组件&#xff0c;同时也支持多模块项目的创建&#xff0c;使得代码结构更加清晰、易于管理。本文将介绍如何使用 Spring Cl…

NModbus的NuGet包使用样例

首先仿真软件ModbusSlave简单配置3条数据&#xff1a; 连接配置&#xff1a; VS中安装NuGet包&#xff1a;NModbus4 简单获取湿度 SerialPort serialPort new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);serialPort.Open();Modbus.Device.ModbusSer…

端口扫描神器:御剑 保姆级教程(附链接)

一、介绍 御剑&#xff08;YooScan&#xff09;是一款网络安全工具&#xff0c;主要用于进行端口扫描。它具有直观的用户界面&#xff0c;方便用户进行端口扫描和信息收集。以下是御剑端口扫描工具的一些主要特点和功能&#xff1a; 图形用户界面&#xff1a; 御剑提供直观的图…

第 123 场 LeetCode 双周赛题解

A 三角形类型 II 三条边能构成三角形的充要条件是任意一边都小于其余两边之和&#xff0c;枚举各边判断能否构成三角形&#xff0c;若能再判断是否存在边想等 class Solution { public:string triangleType(vector<int> &nums) {int s accumulate(nums.begin(), num…

工厂方法模式(Factory Method Pattern)

原文地址:https://jaune162.blog/design-pattern/factory-method-pattern/ 概述 工厂方法模式(Factory Method Pattern)是一个对象创建型模式。 定义一个用于创建对象的接口,让子类决定实例化哪一个类。 Factory Method使一个类的实例化延迟到其子类。 – 《设计模式:可复…

灵活应对:策略模式在软件设计中的应用

策略模式是一种行为型设计模式&#xff0c;它允许定义一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以互换使用。策略模式让算法的变化独立于使用算法的客户端&#xff0c;使得在不修改原有代码的情况下切换或扩展新的算法成为可能。 使用策略模式的场景包…

《合成孔径雷达成像算法与实现》Figure6.9

clc clear close all参数设置 距离向参数设置 R_eta_c 20e3; % 景中心斜距 Tr 2.5e-6; % 发射脉冲时宽 Kr 20e12; % 距离向调频率 alpha_os_r 1.2; % 距离过采样率 Nrg 320; % 距离线采样数 距离向…

java 基础 (1)简介-程序基础-流程控制-数组操作

学习教程 java入门 JavaEE JavaSe JavaMe 简单来说&#xff0c;Java SE就是标准版&#xff0c;包含标准的JVM和标准库&#xff0c;而Java EE是企业版&#xff0c;它只是在Java SE的基础上加上了大量的API和库&#xff0c;以便方便开发Web应用、数据库、消息服务等&#xff0c;…

运维必会篇-主从复制

主从复制 概述 主从复制是指将主数据库的 DDL 和 DML 操作通过二进制日志传到从库服务器中&#xff0c;然后在从库上对这 些日志重新执行&#xff08;也叫重做&#xff09;&#xff0c;从而使得从库和主库的数据保持同步。 MySQL支持一台主库同时向多台从库进行复制&#xf…

进程间通信(3):共享内存

多个进程共享同一片内存空间&#xff0c;不需要进行数据的拷贝&#xff0c;效率最高&#xff1b;但存在资源竞争问题。 函数&#xff1a;shmget(搭配ftok)、shmat、shmdt、shmctl 实现流程&#xff1a; 1、创建共享内存IPC对象 shmget(ftok) 2、内存映射 shmat 3、通信 sca…

JVM Java虚拟机入门指南

文章目录 为什么学习JVMJVM的执行流程JVM的组成部分类加载运行时数据区本地方法接口执行引擎 垃圾回收什么样的对象是垃圾呢内存溢出和内存泄漏定位垃圾的方法对象的finalization机制垃圾回收算法分代回收垃圾回收器 JVM调优参数JVM调优工具Java内存泄漏排查思路CPU飙高排查方案…

Vue3快速上手(二)VSCode官方推荐插件安装及配置

一、VSCode官方插件安装&#xff0c;如下图2款插件 在用vite创建的程序里&#xff0c;提示提安装推荐的插件了&#xff0c;如下图&#xff1a; 二、配置 在设置-扩展里找到Volar插件&#xff0c;将Dot Value勾选上。这样在ref()修改变量时&#xff0c;会自动填充.value,无需…

Windows权限维持

注册表类&#xff1a; 普通注册表后门 在一般用户权限下&#xff0c;通常是将要执行的后门程序或脚本路径填写到如下注册表的键值中HKCU\Software\Microsoft\Windows\CurrentVersion\Run&#xff0c;键名任意。普通权限即可运行 cmd下操作&#xff1a; reg add "HKEY_…

Linux虚拟文件系统(VFS)

虚拟地址空间通常是与进程密切相关的概念&#xff0c;而不是文件系统。虚拟地址空间是为了提供进程对内存的抽象和隔离而设计的。 文件系统不使用页表&#xff0c;直接使用物理地址。 虚拟文件系统是linux内核的一个核心子系统。、 虚拟文件系统的目的&#xff1a;通过一个抽…

【ES数据可视化】kibana实现数据大屏

目录 1.概述 2.绘制数据大屏 2.1.准备数据 2.2.绘制大屏 3.嵌入项目中 1.概述 再来重新认识一下kibana&#xff1a; Kibana 是一个用于数据可视化和分析的开源工具&#xff0c;是 Elastic Stack&#xff08;以前称为 ELK Stack&#xff09;中的一部分&#xff0c;由 Ela…