C++ for QWidget:正则表达式和QRegExp

正则表达式

正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是计算机科学的一个概念。以下是对正则表达式的详细介绍:

一、定义与作用

正则表达式是一种文本模式,同时也是一种强大的文本模式匹配工具,用于对字符串进行搜索、替换、匹配和验证等操作。它使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。

二、构成与语法

正则表达式由普通字符(例如,a到z之间的字母)和特殊字符(称为"元字符")组成。这些元字符在正则表达式中具有特殊意义,可以用来规定其前导字符在目标对象中的出现模式。以下是一些常见的元字符及其用法:

  • 普通字符‌:包括大小写字母、数字、标点符号及一些其他符号。

  • 转义字符‌:\,用于取消特殊符号的含义,例如 !、$等。

  • 边界符‌:

    • ^:匹配字符串开始的位置,例如 ^a、^the。
    • :匹配字符串结束的位置,例如word:匹配字符串结束的位置,例如word、\^匹配空行。
  • 匹配任意字符‌:. 匹配除换行符之外的任意的一个字符,例如 go.d、g..d。

  • 量词‌:用于设定某个模式重复次数。

    • *:匹配前面的子表达式0次或者多次,例如 good、go.*d。
    • +:匹配前面的子表达式1次以上,例如 go+d,将匹配至少一个o,如god、good、goood等(注意,在某些工具或语言中,如egrep、awk,+ 可能不需要转义)。
    • ?:匹配前面的子表达式0次或者1次,例如 go?d,将匹配gd或god(在某些工具或语言中,? 可能不需要转义)。
    • {n}:匹配前面的子表达式n次,例如 go{2}d、'[0-9]{2}'匹配两位数字。
    • {n,}:匹配前面的子表达式不少于n次,例如 go{2,}d、'[0-9]{2,}'匹配两位及两位以上数字。
    • {n,m}:匹配前面的子表达式n到m次,例如 go{2,3}d、'[0-9]{2,3}'匹配两位到三位数字。
  • 字符集合‌:[],匹配方括号中的任意一个字符。

    • list\]:匹配list列表中的一个字符,例如 go\[ola\]d,\[abc\]、\[a-z\]、\[a-z0-9\]、\[0-9\]匹配任意一位数字。

例子:"^[A-Za-z0-9]+([_\.][A-Za-z0-9]+)*@([A-Za-z0-9\-]+\.)+[A-Za-z]{2,6}$"

这个例子^标识符表示开始,$表示结束,[A-Za-z0-9]+表示匹配多次中括号表示的范围,[_\.]表示匹配_或.但由于.在正则表达式中有匹配除换行符之外的任意的一个字符的功能,所以前面添加\取消它的特殊含义,[A-Za-z0-9\-]中由于-有特殊含义所以使用了\取消特殊含义,[A-Za-z]{2,6}表示匹配中括号中的字符范围至少2次至多6次

QRegExp

一、功能特点

  1. 字符串匹配‌:QRegExp可以验证字符串是否符合指定的正则表达式模式。
  2. 字符串搜索‌:它可以在更长的文本中查找子串的匹配位置。
  3. 文本替换‌:QRegExp能够替换符合正则表达式的字符串片段。
  4. 捕获组‌:通过正则表达式中的括号,可以定义捕获组来提取匹配的子表达式内容。

二、使用方法

  1. 创建QRegExp对象‌:

    • 可以直接使用正则表达式字符串来创建QRegExp对象,例如:QRegExp regExp("a*b"); 这会匹配任何数量的'a'后面跟着一个'b'。
  2. 设置和获取正则表达式‌:

    • 使用setPattern()方法可以设置一个新的正则表达式。
    • 使用pattern()方法可以获取当前的正则表达式。
  3. 匹配操作‌:

    • 使用exactMatch()方法可以检查一个字符串是否与正则表达式完全匹配。
    • 使用indexIn()方法可以在文本中搜索匹配项,并返回匹配项的位置。
    • cap()方法用于提取捕获组的内容。
  4. 替换操作‌:

    • 虽然QRegExp本身不直接提供替换功能,但可以与QString的replace()方法结合使用来实现替换操作。例如:QString replaced = text.replace(QRegExp("ain"), "ane"); 这会将文本中的"ain"替换为"ane"。
  5. 与QLineEdit结合使用‌:

    • QRegExpValidator是一个验证器,可以与QLineEdit等输入字段结合使用,以限制输入格式。例如:QRegExp regExp("^\\d{3}-\\d{2}-\\d{4}$"); 这会匹配格式XXX-XX-XXXX的字符串,并将其作为QLineEdit的输入验证器。

例如:

cpp 复制代码
QRegExp a("^[A-Za-z0-9]+([_\.][A-Za-z0-9]+)*@([A-Za-z0-9\-]+\.)+[A-Za-z]{2,6}$");
bool b = a.exactMatch(ui->accountEdit->text());

这一段代码创建了一个存放正则表达式的变量a,随后使用a.exactMatch函数判断text()的内容是否符合并用布尔值b接收

注意

使用CMake构造的项目中,可能需要在CMakeLists.txt下手动添加如下指令,否则#include<QRegExp>时检测不到:

find_package(Qt6 REQUIRED COMPONENTS Core5Compat)

target_link_libraries(mytarget PRIVATE Qt6::Core5Compat)//mytarget修改为项目名称

相关推荐
R-G-B12 分钟前
【10】MFC入门到精通——MFC 创建向导对话框、属性页类、属性表类、代码
c++·mfc·创建向导对话框·创建属性页类·创建属性表类
AA陈超1 小时前
虚幻引擎5 GAS开发俯视角RPG游戏 P06-16 属性菜单 - 构建
c++·游戏·ue5·游戏引擎·虚幻
天***88962 小时前
Edge浏览器无法安装扩展CRX_REQUIRED_PROOF_MISSING扩展的按钮开关为灰色,无法启用
c++
云知谷2 小时前
【经典书籍】C++ Primer 第19章特殊工具与技术精华讲解
c语言·开发语言·c++·软件工程·团队开发
不是老弟2 小时前
rwqsd
数据结构·c++·算法
小龙报2 小时前
《C语言疑难点 --- 字符函数和字符串函数专题(上)》
c语言·开发语言·c++·算法·学习方法·业界资讯·visual studio
咔咔咔的3 小时前
3461. 判断操作后字符串中的数字是否相等 I
c++
liulilittle4 小时前
LwIP协议栈MPA多进程架构
服务器·开发语言·网络·c++·架构·lwip·通信
艾莉丝努力练剑4 小时前
【C++:继承】面向对象编程精要:C++继承机制深度解析与最佳实践
开发语言·c++·人工智能·继承·c++进阶
penguin_bark4 小时前
C++ 异步编程(future、promise、packaged_task、async)
java·开发语言·c++