Qt 正则表达式
正则表达式是一种用于匹配文本的强大工具,可以方便地提取出我们所需要的信息,Qt 提供了 QRegExp 类来支持正则表达式的使用。本文将介绍如何在 Qt 中使用正则表达式。
QRegExp 类
QRegExp 类是 Qt 中用于处理正则表达式的类,它的头文件为:
#include <QRegExp>
在 Qt 中使用 QRegExp 需要使用它的成员函数 setPattern() 设置正则表达式的模式,调用成员函数 indexIn() 查找文本中匹配该正则表达式模式的第一个位置的索引,如果没有匹配便返回 -1。如果找到了匹配的位置,可以使用成员函数 cap() 返回匹配的值。
QRegExp 类的用法如下:
QString str = "hello world";
QRegExp rx("hel");
int pos = rx.indexIn(str); // 查找匹配模式的第一个位置索引
if (pos >= 0) {
qDebug() << rx.cap(0); // 输出匹配的值
}
结果输出为:
"hel"
在上面的代码中,我们定义了一个字符串 str 和一个匹配模式为 “hel” 的 QRegExp 对象 rx,调用了它的 indexIn() 函数查找了字符串中匹配该正则表达式模式的第一个位置的索引。由于找到了匹配的位置,我们便输出了匹配的值。
需要注意的是,cap() 函数返回值的索引从 0 开始,代表匹配的文本中第一个被捕获的子字符串。
正则表达式语法
在使用 QRegExp 前,我们需要先学习正则表达式语法。下面是一些常用的正则表达式语法:
元字符
元字符是正则表达式中具有特殊含义的字符,它们可以匹配特定的字符或者字符集。下面列出一些常用的元字符和它们所代表的意义:
元字符 | 描述 |
---|---|
. | 匹配除“行终止符”外的任意一个字符 |
* | 匹配前面的子表达式 0 次或多次 |
+ | 匹配前面的子表达式 1 次或多次 |
? | 匹配前面的子表达式 0 次或 1 次 |
^ | 匹配输入字符串的开始位置 |
$ | 匹配输入字符串的结束位置 |
[] | 匹配任意一个方括号中的字符 |
[ ^] | 匹配除方括号中的任意一个字符以外的字符 |
() | 将其中的内容视为一个整体 |
| | 匹配其中之一 |
{ n} | 匹配前面的子表达式恰好 n 次 |
{ n,} | 匹配前面的子表达式至少 n 次 |
{ n,m} | 匹配前面的子表达式至少 n 次,但不超过 m 次 |
限定符
限定符是用于描述可重复次数的元字符。下面列出一些常用的限定符:
限定符 | 描述 |
---|---|
* | 匹配前面的子表达式 0 次或多次 |
+ | 匹配前面的子表达式 1 次或多次 |
? | 匹配前面的子表达式 0 次或 1 次 |
{ n} | 匹配前面的子表达式恰好 n 次 |
{ n,} | 匹配前面的子表达式至少 n 次 |
{ n,m} | 匹配前面的子表达式至少 n 次,但不超过 m 次 |
特殊字符
下面列出一些常用的特殊字符:
特殊字符 | 描述 |
---|---|
\ | 转义字符,用于匹配元字符本身 |
\d | 匹配数字字符 |
\D | 匹配非数字字符 |
\s | 匹配空白字符 |
\S | 匹配非空白字符 |
\w | 匹配字母、数字、下划线 |
\W | 匹配除字母、数字、下划线以外的字符 |
匹配模式
匹配模式指的是一组用于控制正则表达式匹配行为的标志。下面列出一些常用的匹配模式:
匹配模式 | 描述 |
---|---|
Qt::CaseInsensitive | 忽略大小写 |
Qt::Multiline | 多行匹配 |
Qt::DotMatchesEverything | 可以匹配任何字符,包括换行符 |
Qt::MatchExactly | 完全匹配 |
Qt::MatchContains | 包含匹配 |
Qt::MatchStartsWith | 以指定字符串开头 |
Qt::MatchEndsWith | 以指定字符串结束 |
Qt::MatchRegExp | 使用正则表达式匹配 |
示例代码
下面是一些使用 QRegExp 进行正则表达式匹配的示例代码:
匹配手机号码
QString str = "My phone number is: 18888888888";
QRegExp rx("\\d{11}"); // 利用元字符 \d 和限定符 {11} 来匹配手机号码
int pos = rx.indexIn(str);
if (pos >= 0) {
qDebug() << rx.cap(0);
}
结果输出为:
"18888888888"
匹配电子邮件地址
QString str = "My email address is: example@example.com";
QRegExp rx("\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b"); // 通过正则表达式来匹配电子邮件地址
int pos = rx.indexIn(str);
if (pos >= 0) {
qDebug() << rx.cap(0);
}
结果输出为:
"example@example.com"
匹配 HTML 标签
QString str = "<head><title>Qt 正则表达式</title></head>";
QRegExp rx("<[^>]*>"); // 通过正则表达式来匹配 HTML 标签
int pos = 0;
while ((pos = rx.indexIn(str, pos)) != -1) {
qDebug() << rx.cap(0);
pos += rx.matchedLength();
}
结果输出为:
"<head>"
"<title>"
"</title>"
"</head>"
在上面的代码中,我们使用正则表达式 <[^>]*>
匹配 HTML 标签,其中元字符 [^>]
表示匹配除了 >
之外的所有字符。
结论
本文介绍了如何在 Qt 中使用 QRegExp 类来进行正则表达式匹配,并且列出了一些常用的正则表达式语法以及匹配模式。以上是一些常见的应用场景,实际上正则表达式还可以用于更多的场合,在实际开发中我们可以根据需要自行调整匹配模式和正则表达式。