正则表达式
正则表达式,又称规则表达式,(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
一、功能特点
- 字符串匹配:QRegExp可以验证字符串是否符合指定的正则表达式模式。
- 字符串搜索:它可以在更长的文本中查找子串的匹配位置。
- 文本替换:QRegExp能够替换符合正则表达式的字符串片段。
- 捕获组:通过正则表达式中的括号,可以定义捕获组来提取匹配的子表达式内容。
二、使用方法
创建QRegExp对象:
- 可以直接使用正则表达式字符串来创建QRegExp对象,例如:
QRegExp regExp("a*b");
这会匹配任何数量的'a'后面跟着一个'b'。设置和获取正则表达式:
- 使用
setPattern()
方法可以设置一个新的正则表达式。- 使用
pattern()
方法可以获取当前的正则表达式。匹配操作:
- 使用
exactMatch()
方法可以检查一个字符串是否与正则表达式完全匹配。- 使用
indexIn()
方法可以在文本中搜索匹配项,并返回匹配项的位置。cap()
方法用于提取捕获组的内容。替换操作:
- 虽然QRegExp本身不直接提供替换功能,但可以与QString的
replace()
方法结合使用来实现替换操作。例如:QString replaced = text.replace(QRegExp("ain"), "ane");
这会将文本中的"ain"替换为"ane"。与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修改为项目名称