Qt——正则表达式

2023-11-12

在项目中经常会遇到对字符串进行操作的情况,我们可以直接使用QString的一些函数,但QT提供了一个更加强大的类——QRegExp,使用正则表达式来操作字符串。

先说说我最近遇到的几个问题:

1.对输入框LineEdit中的输入内容加以限制,比如只能输入数字,并且最多5位数(因为int类型不限制位数会导致溢出问题);

2.检查输入是否正确,比如判断是否是1-9999之间的数;

3.获取一个字符串中的一段内容,比如获取2015-11-20中的2015。

为了解决这些问题,下面先看看正则表达式的基本知识。

 

一、基本知识

正则表达式(Regular Expression,通常简写为RegExp、RE等),预先定义一些字符或字符的组合,用于匹配文本中的一段字符串。下面是它的一些用途——

1.验证

判断字符串是否符合某个标准,比如“是一个整数”或者“没有空格”。

2.搜索

正则表达式提供了比普通字符串匹配更为强大的匹配方式,比如匹配下面的词语:mail, letter, correspondence,但是不包括email, mailman, letterbox等等。

3.查找并替换

正则表达式能够用一个不同的字符串,替换所有出现另一个字符串的地方,比如用&替换&,如果原先&后面已经有了amp;那么不替换。

4.分割字符串

比如,根据tab来分割字符串。

使用正则表达式首先需要了解一些符号的作用,比如\d用来匹配数字,下面结合一些例子说明。

例子 解释
[abc] 方括号中间是几个字母,表示a,b,c这三个单独的字符
[^abc] 除了a,b,c以外的字符
[a-z] 横杠表示范围,匹配a到z之间(包括a和z)的所有单个字符
[a-zA-Z] a到z、A到Z的所有单个字符
^ 在一行最前
$ 在一行的最后
\s 匹配任意空白字符
\S 匹配任意非空白的字符
\d 任意数字
\D 任意非数字
\w 任意单字字符(字母、数字或下划线)
\W 任意非单字字符
(a|b) a或b
a? ?代表0个或1个
a* *代表0个或1个或多个
a+ +代表1个或多个
a{3} 3个a
a{3,} 3个或大于3个a
a{3,6} a的个数在3和6之间(包括3和6)

注意:C++编译器会对反斜杠进行转换,要想在正则表达式中包括一个\,需要输入两次,例如\\s。要想匹配反斜杠本身,需要输入4次,比如\\\\。

 

二、在QT中的用法

1.对用户输入的限制

void QLineEdit::setValidator(const QValidator * v)

QLineEdit中的这个函数意思是,令LineEidt只接受验证器 v 所匹配的输入,你可以对要输入的内容进行任意的限制。

比如:限制输入框只能输入0到99999

QRegExp regExp("0|[1-9]\\d{0,4}");
ui.lineEdit->setValidator(new QRegExpValidator(regExp, this));

2.检查输入是否符合格式

QValidator::State QRegExpValidator::validate(QString & input, int & pos) const

如果输入与正则表达式相匹配,则返回Acceptable;如果部分匹配,则返回Intermediate(部分匹配,意思是如果给它增加额外的字符则能够匹配正则表达式);如果不匹配则返回Invalid。

enum QValidator::State

这个枚举类型说明了被验证的字符串是哪种类型。

QValidator::Invalid:值为0,表示字符串完全不匹配;

QValidator::Intermediate:值为1,表示部分匹配;

QValidator::Acceptable:值为2,表示完全匹配。

// integers 1 to 9999
QRegExp rx("[1-9]\\d{0,3}");
// the validator treats the regexp as "^[1-9]\\d{0,3}$"
QRegExpValidator v(rx, 0);
QString s;
int pos = 0;
 
s = "0";     v.validate(s, pos);    // returns Invalid
s = "12345"; v.validate(s, pos);    // returns Invalid
s = "1";     v.validate(s, pos);    // returns Acceptable
 
rx.setPattern("\\S+");            // one or more non-whitespace characters
v.setRegExp(rx);
s = "myfile.txt";  v.validate(s, pos); // Returns Acceptable
s = "my file.txt"; v.validate(s, pos); // Returns Invalid
 
// A, B or C followed by exactly five digits followed by W, X, Y or Z
rx.setPattern("[A-C]\\d{5}[W-Z]");
v.setRegExp(rx);
s = "a12345Z"; v.validate(s, pos);        // Returns Invalid
s = "A12345Z"; v.validate(s, pos);        // Returns Acceptable
s = "B12";     v.validate(s, pos);        // Returns Intermediate
 
// match most 'readme' files
rx.setPattern("read\\S?me(\.(txt|asc|1st))?");
rx.setCaseSensitive(false);
v.setRegExp(rx);
s = "readme";      v.validate(s, pos); // Returns Acceptable
s = "README.1ST";  v.validate(s, pos); // Returns Acceptable
s = "read me.txt"; v.validate(s, pos); // Returns Invalid
s = "readm";       v.validate(s, pos); // Returns Intermediate

^[0-9]+3c$

看上面的表达式,开头的^表示必须以[0-9]+开头,结尾的$表示必须以字母c结尾,如果输入的是123a,则返回QValidator::Intermediate,表示部分匹配,如果输入的是233abc,则完全匹配。

3.截取字符串

QString QRegExp::cap(int nth = 0) const

这个函数返回被第n个子表达式捕获的文本,整个匹配拥有下标0,带括号的子表达式下标从1开始。

QRegExp rxlen("(\\d+)(?:\\s*)(cm|inch)");
int pos = rxlen.indexIn("Length: 189cm");
if (pos > -1) {
    QString value = rxlen.cap(1); // "189"
    QString unit = rxlen.cap(2);  // "cm"
    // ...
}

 

关于正则表达式的知识还有很多,比如结合QString的replace、split等函数使用,更多用法可以参考Qt Assistant。

转载于:https://www.cnblogs.com/hellovenus/p/4984751.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt——正则表达式 的相关文章

  • 数理统计知识整理——回归分析与方差分析

    题记 时值我的北科研究生第一年下 选学 统计优化 课程 备考促学 成此笔记 以谨记 1 线性回归 1 1 原理分析 要研究最大积雪深度x与灌溉面积y之间的关系 测试得到近10年的数据如下表 使用线性回归的方法可以估计x与y之间的线性关系 线
  • dev-c++官网位置和源码/库位置

    1 http devpaks org 2 http www bloodshed net 3 http www bloodshed net dev 转载于 https www cnblogs com vilyLei articles 1812
  • Unity中UI框架的使用1-添加面板、显示Loading页面

    其中BasePanel和Canvas都是挂在面板的预制物上的 1 导入我们的UI框架 本篇文章中有用的是两个UIPanelType NUIManager和NBasePanel 会放在文章最后供大家使用 2 先将我们做好的Panel设置成预制
  • floor(),ceil()函数

    地板 天花板函数 均包含在math h中 意思分别为 返回不大于形参的最小整数和不小于形参的最大整数 include
  • R----dplyr包介绍学习

    dplyr包 plyr包的替代者 专门面对数据框 将ddplyr转变为更易用的接口 gt 来自dplyr包的管道函数 其作用是将前一步的结果直接传参给下一步的函数 从而省略了中间的赋值步骤 可以大量减少内存中的对象 节省内存 可惜的是应用范
  • LVGL学习(3):页面切换原理和页面管理实现

    在LVGL中 大多情况下是有多个页面的 一般来说页面的切换有两种情况 删除当前的页面 创建新页面加载 保留当前的页面 创建新页面加载 我们来分析一下这两种情况 比如页面1有一个列表框 有三个选项 每个选项对应进入一个页面 假设此时我们的焦点
  • Public Private Protect Inheritance and access specifiers

    In the previous lessons on inheritance we ve been making all of our data members public in order to simplify the example
  • visual studio 一直显示正在准备解决方案

    首先重启电脑 无法解决的情况下执行以下步骤 Kill Visual Studio Open Visual Studio without loading a solution Disable AnkhSvn as Source Control
  • Android4.0 SDK功能详解

    我在eoe的论坛找到的 就复制过来了 跟大家分享一下 Android 4 0 平台API等级 14 Android 4 0 是一次重要的平台发布版 为用户和应用程序开发者增加了大量的新特性 在下面我们将讨论的所有新特性和API中 因为它将
  • 【干货】如何实现WinApp的UI自动化测试?

    WinApp WindowsAPP 是运行在Windows操作系统上的应用程序 通常会提供一个可视的界面 用于和用户交互 例如运行在Windows系统上的Microsoft Office PyCharm Visual Studio Code
  • 「盘点」界面控件DevExtreme UI v23.1中的API增强

    DevExtreme gt https www evget com product 3150 拥有高性能的HTML5 JavaScript小部件集合 使您可以利用现代Web开发堆栈 包括React Angular ASP NET Core
  • C/C++编程:令人印象深刻的高级技巧案例

    C C 编程语言在软件开发领域有着悠久的历史 由于其高效 灵活和底层访问能力 至今仍然被广泛应用 本文将介绍一些在C C 编程中令人印象深刻的高级技巧 帮助读者提升编程水平 更加高效地使用这两种强大的编程语言 一 指针运算与内存管理 C C
  • UI 易用性测试 以及自动化实现!

    GUI 是指图形用户界面 UI 是指用户界面 对于纯软件系统 这两者没有本质的区别 GUI易用性测试与 UI 易用性测试内容一致 但是如果测试的对象是一个产品 这两者则存在区别 对于产品 UI 则不仅仅包括 GUI 还包括产品硬件部分的测试
  • Axure RP 8 for Mac/win中文版:打造完美交互式原型设计体验

    Axure RP 8 一款引领潮流的交互式原型设计工具 为设计师提供了无限的可能性 让他们能够创造出逼真的原型 从而更好地展示和测试他们的设计 Axure RP 8拥有丰富的功能和工具 让设计师可以轻松地创建出复杂的交互式原型 从简单的按钮
  • element ui弹窗在别的弹窗下方,优先级不高的问题

    在 弹窗 的标签中加入append to body即可解决该问题
  • element ui弹窗在别的弹窗下方,优先级不高的问题

    在 弹窗 的标签中加入append to body即可解决该问题
  • Mac版 Photoshop 2021---PS2021

    Adobe Photoshop 2021是一款强大的图像处理软件 它可以帮助用户进行各种图像编辑 修饰和合成工作 这款软件拥有先进的图像处理技术 支持多种图像格式 可以轻松实现各种复杂的图像处理任务 它还提供了丰富的滤镜和工具 使用户可以自
  • C 语言文件读取全指南:打开、读取、逐行输出

    C 语言中的文件读取 要从文件读取 可以使用 r 模式 FILE fptr 以读取模式打开文件 fptr fopen filename txt r 这将使 filename txt 打开以进行读取 在 C 中读取文件需要一点工作 坚持住 我
  • 在 OS X 上的 virtualenv 中安装 scrapy 加密时发生错误 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我正在安装 scrapypip in virtualenv on OS X 10 11 当它安装密码学时 它说 buil
  • C中的内存使用问题

    请帮忙 操作系统 Linux 其中 sleep 1000 中 此时 top 显示Linux任务 给我写了7 7 MEM使用 valgrind 未发现内存泄漏 我明白 写得正确 所有 malloc 结果都是 NULL 但是为什么这次 睡眠 我

随机推荐

  • Fiddler 八个实用技巧

    目录 前言 1 双击Session时 使响应页始终显示到 json tab页 使请求页始终显示到 webform tab页 2 显示每个Session 的请求IP地址 3 修改响应Header中的Content Type 4 右键sessi
  • 2023AE软件、Adobe After Effects安装下载教程

    2023AE软件是一款由Adobe公司开发的视频编辑软件 也被称为Adobe After Effects 它在广告 电影 电视和网络视频等领域广泛应用 用于制作动态图形 特效 合成和其他视觉效果 该软件支持多种视频和音频文件格式 具有丰富的
  • mybatis增删改查

    MyBatis 是一款优秀的持久层框架 它支持定制化 SQL 存储过程以及高级映射 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集 MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息 将接口和
  • C语言第五章第3节用do...while语句实现循环学习导案

    课 题 5 3 用do while语句实现循环 课时安排 2课时 课 型 新授 学 习目标 掌握do while循环语句的一般形式 掌握do while循环语句的执行过程 掌握do while语句和while语句的区别 重点 do whil
  • STM32F4 IAP实现总结

    目录 IAP相关 IAP概念 IAP与ICP ISP的区别 STM32F4的启动模式 FLASH相关 STM32F4 FLASH简介 STM32的内部闪存组织架构和其启动过程 应用IAP时的FLASH分配 IAP工程在Keil中的设置 跳转
  • 通过深度学习实现安全帽佩戴的检测

    北京 上海巡回站 NVIDIA DLI深度学习培训 2018年1月26 1月12日 NVIDIA 深度学习学院 带你快速进入火热的DL领域 阅读全文 gt
  • 广度优先遍历(邻接表,邻接矩阵)

    广度优先遍历又称为广度优先搜索 简称BFS 如果说图的深度优先遍历 图的深度优先遍历相关内容 图的深度优先遍历 类似树的前序遍历 那么图的广度优先遍历就类似于树的层序遍历 具体遍历过程如下图所示 就如上面的第三个图上所编写的序号进行遍历 我
  • vue axios请求设置content-type无效

    vue admin template开发中在request请求中设置了Content type 但是在在浏览器中查看请求主体并没有Content type service interceptors request use config gt
  • Python刷题-6

    1 下面哪个不是Python合法的标识符 B A int32 B 40XL C self D name python中的标识符 1 第一个字符必须是字母表中字母或下划线 2 标识符的其他的部分由字母 数字和下划线组成 3 标识符对大小写敏感
  • 搭建ROS & CLion开发环境

    翻译自http wiki ros org IDEs CLion 有小改动 更新 搭建ROS2 CLion开发环境 1 插件 目前CLion有三个积极维护的ROS插件 Hatchery ROS Robot Operating System R
  • M1卡性能简介及存取控制字节规则详解

    M1卡性能简介及存取控制字节规则详解 一 主要指标 容量为 8K 位 EEPROM 分为 16 个扇区 每个扇区为 4 块 每块 16 个字节 以块为存取单位 每个扇区有独立的一组密码及访问控制 每张卡有唯一序列号 为 32 位 具有防冲突
  • 【华为OD机试 2023】 相同数字组成图形的周长(C++ Java JavaScript Python)

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • jdbc-plus是一款基于JdbcTemplate增强工具包,基于JdbcTemplate已实现分页、多租户、动态表名等插件,可与mybatis、mybatis-plus等混合使用

    jdbc plus简介 jdbc plus是一款基于JdbcTemplate增强工具包 基于JdbcTemplate已实现分页 多租户 动态表名等插件 可与mybatis mybatis plus等混合使用 还可以十分简单的扩展自定义插件
  • Android studio 接入腾讯TBSx5内核的解决方案

    Android studio 接入腾讯TBSx5内核的解决方案 首页我们查看一下腾讯浏览服务的官网 https x5 tencent com tbs guide sdkInit html 二 背景知识 1 TBS 腾讯浏览服务 的优势 1
  • 利用工厂模式和策略模式来替代if else

    对于代码写到一定地步 肯定会遇到很多业务代码的繁琐的if else分支 简单的几个条件可以if else几个 但是一旦后面的条件越来越多 有没有更好的替代让代码看起来没那么臃肿 更好维护 而不是一个if一个if的看过去 其实是有的 就是工厂
  • Windows系统上安装Linux系统

    一 安装前准备 这里采用的系统是Windows 10 VMware workstation虚拟机软件 CentOS 7镜像 VMware workstation虚拟机软件的安装这里不讲解 准备安装Linux系统的笔记本或电脑一定要插好网线
  • 从键盘输入一个整数n(1000<=n<=1000000)编程计算并输出n的所有约数中最大的三位数(即最大的三位约数)。(如:当n为555555时,最大三位约数是777)如果n小于1000或者大于100

    include
  • 【程序控制结构】

    三大结构 顺序 选择 循环 一 顺序结构 1 print 输出函数 print 函数的作用是向终端 或系统隐性指定的输出设备 输出若干个任意类型的数据 语法格式1 print 输出项 1 输出项 2 语法格式2 print 输出项 1 输出
  • UVa10881题解报告

    题目 L长的棍子上有n个蚂蚁 他们分别向左或右爬 速度为1 求T时间后各蚂蚁的状态 题解 白书给出了一个很巧妙的解法 将蚂蚁看作质点 相撞掉头等于对穿而过 因为掉头所以 他们最后的顺序与输入时在棍子上的顺序相同 所以只要记录下初始状态下蚂蚁
  • Qt——正则表达式

    在项目中经常会遇到对字符串进行操作的情况 我们可以直接使用QString的一些函数 但QT提供了一个更加强大的类 QRegExp 使用正则表达式来操作字符串 先说说我最近遇到的几个问题 1 对输入框LineEdit中的输入内容加以限制 比如