QRegularExpression

目录

  • QRegularExpression
    • [1. QRegularExpression 概述](#1. QRegularExpression 概述)
    • [2. 基本用法](#2. 基本用法)
      • [2.1 创建正则表达式对象](#2.1 创建正则表达式对象)
      • [2.2 匹配字符串](#2.2 匹配字符串)
      • [2.3 查找所有匹配项](#2.3 查找所有匹配项)
      • [2.4 使用捕获组](#2.4 使用捕获组)
      • [2.5 替换字符串](#2.5 替换字符串)
    • [3. 正则表达式常见操作](#3. 正则表达式常见操作)
    • [4. 进阶功能](#4. 进阶功能)
    • [5. 字符串匹配和替换示例](#5. 字符串匹配和替换示例)
    • [6. 性能优化](#6. 性能优化)
    • [7. 错误处理](#7. 错误处理)
    • [8. 常见正则表达式模式](#8. 常见正则表达式模式)
    • [9. 实际应用示例](#9. 实际应用示例)
      • [9.1 验证输入格式](#9.1 验证输入格式)
      • [9.2 从文本中提取信息](#9.2 从文本中提取信息)
      • [9.3 替换敏感词](#9.3 替换敏感词)
    • [10. QRegularExpression 文档概述](#10. QRegularExpression 文档概述)
      • [10.1 QRegularExpression::MatchOptions](#10.1 QRegularExpression::MatchOptions)
      • [10.2 QRegularExpression::MatchType](#10.2 QRegularExpression::MatchType)
      • [10.3 QRegularExpression::PatternOption](#10.3 QRegularExpression::PatternOption)
      • [10.4 QRegularExpression::WildcardConversionOption](#10.4 QRegularExpression::WildcardConversionOption)
      • [10.5 QRegularExpressionMatch](#10.5 QRegularExpressionMatch)
      • [10.6 QRegularExpressionMatchIterator](#10.6 QRegularExpressionMatchIterator)
      • [10.7 QRegularExpressionValidator](#10.7 QRegularExpressionValidator)

QRegularExpression

1. QRegularExpression 概述

QRegularExpression 是 Qt 5.10 引入的类,用于处理正则表达式。它提供了更现代和高效的正则表达式功能,支持 Perl 兼容的正则表达式(PCRE),与之前的 QRegExp 相比,性能和功能都得到增强。

正则表达式30分钟入门教程

正则表达式(regex)是处理字符串和文本的强大工具,广泛应用于各种场景。以下是一些常见的用法:

应用场景 描述 示例
验证 regex 可以测试子字符串是否满足特定条件,例如检查是否为整数或是否包含空格。 ^\d+$ 用于验证一个字符串是否只包含数字。
搜索 regex 提供了强大的模式匹配功能,能够比简单的子字符串匹配更精确地查找。 \bmail\b 用于在文本中查找完整的单词 "mail"。
搜索和替换 regex 可以用不同的子字符串替换所有出现的匹配项。 &(?!(amp;)) 可用于将所有出现的 & 替换为 &,但排除后面跟着 amp; 的情况。
字符串分割 regex 可用于确定拆分字符串的位置,例如按制表符分隔的字符串。 \t 可用于按制表符拆分字符串,如 string1\tstring2\tstring3

关于正则表达式的好参考包括:

2. 基本用法

2.1 创建正则表达式对象

cpp 复制代码
#include <QRegularExpression>
#include <QString>
#include <QDebug>

int main() 
{
    QString pattern = R"(\d+)"; // 匹配一个或多个数字
    QRegularExpression regex(pattern);

    if (!regex.isValid()) 
    {
        qDebug() << "Invalid regular expression!";
    }

    return 0;
}

2.2 匹配字符串

使用 match 方法进行单次匹配:

cpp 复制代码
QString text = "The number is 12345.";
QRegularExpressionMatch match = regex.match(text);

if (match.hasMatch()) 
{
    qDebug() << "Match found:" << match.captured(0); // 捕获整个匹配
} 
else 
{
    qDebug() << "No match found.";
}

2.3 查找所有匹配项

使用 globalMatch 查找所有匹配项:

cpp 复制代码
QString text = "Numbers: 123, 456, 789.";
QRegularExpressionMatchIterator it = regex.globalMatch(text);

while (it.hasNext()) 
{
    QRegularExpressionMatch match = it.next();
    qDebug() << "Match found:" << match.captured(0);
}

2.4 使用捕获组

正则表达式可以包含捕获组,用于提取子模式:

cpp 复制代码
QString pattern = R"(\d+)-(\w+)"; // 匹配数字-字母组合
QRegularExpression regex(pattern);
QString text = "Order number is 1234-ABCD.";

QRegularExpressionMatch match = regex.match(text);
if (match.hasMatch()) 
{
    qDebug() << "Full match:" << match.captured(0); // 整个匹配
    qDebug() << "First group:" << match.captured(1); // 第一个捕获组
    qDebug() << "Second group:" << match.captured(2); // 第二个捕获组
}

2.5 替换字符串

使用 QString::replace 方法与正则表达式结合,可以进行替换操作:

cpp 复制代码
QString pattern = R"(\d+)"; // 匹配一个或多个数字
QRegularExpression regex(pattern);

QString text = "Replace 123 with XYZ.";
QString replacedText = text.replace(regex, "XYZ");

qDebug() << "Original text:" << text;
qDebug() << "Replaced text:" << replacedText; // 输出: "Replace XYZ with XYZ."

3. 正则表达式常见操作

  • 匹配 :使用 match() 方法。
  • 查找 :使用 globalMatch() 方法获取所有匹配项。
  • 替换 :使用 QString::replace() 方法结合正则表达式。
  • 捕获组 :使用括号 () 来定义捕获组,通过 captured() 方法访问。

4. 进阶功能

  • 模式修饰符:可以使用模式修饰符来改变匹配行为,例如忽略大小写。

    cpp 复制代码
    QRegularExpression regex("pattern", QRegularExpression::CaseInsensitiveOption);
  • 支持 UnicodeQRegularExpression 自然支持 Unicode 字符集。

5. 字符串匹配和替换示例

以下是一个完整的示例,展示了如何使用 QRegularExpression 进行字符串匹配和替换:

cpp 复制代码
#include <QCoreApplication>
#include <QRegularExpression>
#include <QString>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QString pattern = R"(\d+)"; // 匹配数字
    QRegularExpression regex(pattern);

    QString text = "Extract numbers: 42 and 1001.";

    // 匹配和提取
    QRegularExpressionMatchIterator it = regex.globalMatch(text);
    while (it.hasNext())
    {
        QRegularExpressionMatch match = it.next();
        qDebug() << "Match found:" << match.captured(0);
    }

    // 替换
    QString replacedText = text.replace(regex, "NUMBER");
    qDebug() << "Replaced text:" << replacedText;

    return a.exec();
}

6. 性能优化

虽然 QRegularExpression 提供了强大的功能,但在处理复杂正则表达式或大文本时,性能可能成为一个问题。以下是一些优化建议:

  • 编译正则表达式 :如果一个正则表达式需要多次使用,可以考虑将其编译为 QRegularExpression 对象,避免重复编译。

    cpp 复制代码
    QRegularExpression regex("your_pattern");
  • 限制匹配范围:尽量减少待匹配文本的范围。例如,可以先进行简单的字符串搜索,确定是否有必要执行复杂的正则表达式匹配。

7. 错误处理

QRegularExpression 提供了错误处理机制,以便在正则表达式无效时获取详细信息。可以使用 errorString() 方法获取错误信息。

cpp 复制代码
QString invalidPattern = "[";
QRegularExpression regex(invalidPattern);
if (!regex.isValid())
{
    qDebug() << "Error:" << regex.errorString();
}

8. 常见正则表达式模式

以下是一些常见的正则表达式模式:

  • 匹配邮箱地址

    regex 复制代码
    R"([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})"
  • 匹配URL

    regex 复制代码
    R"((https?://[^\s/$.?#].[^\s]*)"
  • 匹配电话号码(简单示例,可能需要根据实际情况调整):

    regex 复制代码
    R"(\+?\d{1,3}[- ]?\(?\d{1,4}?\)?[- ]?\d{1,4}[- ]?\d{1,9})"

9. 实际应用示例

以下是一些实际应用场景,展示了如何使用 QRegularExpression 处理不同类型的文本数据。

9.1 验证输入格式

假设你需要验证用户输入的邮箱格式:

cpp 复制代码
QString email = "example@domain.com";
QRegularExpression emailRegex(R"([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})");

if (emailRegex.match(email).hasMatch()) 
{
    qDebug() << "Valid email format.";
} 
else
{
    qDebug() << "Invalid email format.";
}

9.2 从文本中提取信息

假设你需要从日志文件中提取时间戳和错误信息:

cpp 复制代码
QString logData = "2023-10-01 12:34:56 ERROR Something went wrong.";
QRegularExpression logRegex(R"((\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) (ERROR|WARNING|INFO) (.+))");

QRegularExpressionMatch match = logRegex.match(logData);
if (match.hasMatch()) 
{
    qDebug() << "Timestamp:" << match.captured(1);
    qDebug() << "Log Level:" << match.captured(2);
    qDebug() << "Message:" << match.captured(3);
}

9.3 替换敏感词

假设你需要过滤用户评论中的敏感词:

cpp 复制代码
QString comment = "This is a bad and ugly comment.";
QString sensitiveWords = R"(bad|ugly)"; // 可以根据需求添加更多词汇
QRegularExpression regex(sensitiveWords);

QString filteredComment = comment.replace(regex, "***");
qDebug() << "Filtered comment:" << filteredComment;

10. QRegularExpression 文档概述

下面是关于 QRegularExpression 相关类和枚举的详细说明,包括其成员类型和用法介绍。

10.1 QRegularExpression::MatchOptions

MatchOptions 枚举定义了用于匹配时的选项。

常数 描述
QRegularExpression::NoMatchOption 未设置匹配选项。
QRegularExpression::AnchorAtOffsetMatchOption 匹配限制在传入的偏移量处精确开始,尽管模式字符串不包含锚定字符。此枚举值在 Qt 6.0 中引入。
QRegularExpression::DontCheckSubjectStringMatchOption 不检查主题字符串的 UTF-16 有效性。使用此选项时要谨慎,因为无效字符串可能导致崩溃或安全问题。此枚举值在 Qt 5.4 中引入。

10.2 QRegularExpression::MatchType

MatchType 枚举定义了匹配类型的选项。

常数 描述
QRegularExpression::NormalMatch 正常匹配完成。
QRegularExpression::PartialPreferCompleteMatch 优先考虑完整匹配,如果没有则报告部分匹配。
QRegularExpression::PartialPreferFirstMatch 找到部分匹配则停止,不尝试其他匹配方案。
QRegularExpression::NoMatch 没有进行匹配。默认构造的 QRegularExpressionMatchQRegularExpressionMatchIterator 返回此类型。此枚举值在 Qt 5.1 中引入。

10.3 QRegularExpression::PatternOption

PatternOption 枚举定义了正则表达式模式的选项。

常数 描述
QRegularExpression::NoPatternOption 没有设置模式选项。
QRegularExpression::CaseInsensitiveOption 模式以不区分大小写的方式与主题字符串匹配。
QRegularExpression::DotMatchesEverythingOption 点元字符 (.) 匹配任何字符,包括换行符。
QRegularExpression::MultilineOption 脱字符 (^) 和美元 ($) 在任意换行符后和前匹配。
QRegularExpression::ExtendedPatternSyntaxOption 增强可读性,忽略未转义的空格和注释。
QRegularExpression::InvertedGreedinessOption 量词贪婪性质倒置:使贪婪变惰性,反之亦然。
QRegularExpression::DontCaptureOption 未命名捕获组不捕获子字符串;命名捕获组正常工作。
QRegularExpression::UseUnicodePropertiesOption \w、\d 等字符类匹配 Unicode 属性而不仅仅是 ASCII 字符。

10.4 QRegularExpression::WildcardConversionOption

WildcardConversionOption 枚举定义了将通配符模式转换为正则表达式模式的方式。

常数 描述
QRegularExpression::DefaultWildcardConversion 没有设置转换选项。
QRegularExpression::UnanchoredWildcardConversion 转换不会锚定模式,允许部分匹配。

10.5 QRegularExpressionMatch

QRegularExpressionMatch 类表示正则表达式的匹配结果,提供了匹配信息获取的方法,如捕获的子字符串和匹配位置等。

示例代码

cpp 复制代码
QString text = "Example: 12345";
QRegularExpression regex(R"(\d+)");
QRegularExpressionMatch match = regex.match(text);

if (match.hasMatch()) 
{
    qDebug() << "Matched value:" << match.captured(0); // 输出捕获的数字
    qDebug() << "Start position:" << match.capturedStart(0);
    qDebug() << "End position:" << match.capturedEnd(0);
}

10.6 QRegularExpressionMatchIterator

QRegularExpressionMatchIterator 用于迭代多个匹配结果。可以通过 globalMatch() 方法获取所有匹配。

示例代码

cpp 复制代码
QString text = "Numbers: 123, 456, 789";
QRegularExpression regex(R"(\d+)");
QRegularExpressionMatchIterator it = regex.globalMatch(text);

while (it.hasNext()) 
{
    QRegularExpressionMatch match = it.next();
    qDebug() << "Found:" << match.captured(0);
}

10.7 QRegularExpressionValidator

QRegularExpressionValidator 使用正则表达式来验证输入字符串的有效性。它可以判断输入是否接受、处于中间状态或无效。

示例代码

cpp 复制代码
#include <QRegularExpressionValidator>
#include <QString>

QString pattern = "[A-Z][0-9]"; // 示例正则表达式
QRegularExpressionValidator validator(QRegularExpression(pattern));

QString input = "A1";
int pos = 0; // 输入位置
if (validator.validate(input, pos) == QValidator::Acceptable) 
{
    qDebug() << "Input is valid.";
} 
else
{
    qDebug() << "Input is invalid.";
}
相关推荐
小俊俊的博客1 小时前
海康RGBD相机使用C++和Opencv采集图像记录
c++·opencv·海康·rgbd相机
7yewh1 小时前
嵌入式Linux QT+OpenCV基于人脸识别的考勤系统 项目
linux·开发语言·arm开发·驱动开发·qt·opencv·嵌入式linux
_WndProc1 小时前
C++ 日志输出
开发语言·c++·算法
薄荷故人_1 小时前
从零开始的C++之旅——红黑树及其实现
数据结构·c++
m0_748240021 小时前
Chromium 中chrome.webRequest扩展接口定义c++
网络·c++·chrome
qq_433554541 小时前
C++ 面向对象编程:+号运算符重载,左移运算符重载
开发语言·c++
努力学习编程的伍大侠1 小时前
基础排序算法
数据结构·c++·算法
yuyanjingtao2 小时前
CCF-GESP 等级考试 2023年9月认证C++四级真题解析
c++·青少年编程·gesp·csp-j/s·编程等级考试
闻缺陷则喜何志丹2 小时前
【C++动态规划 图论】3243. 新增道路查询后的最短距离 I|1567
c++·算法·动态规划·力扣·图论·最短路·路径
charlie1145141913 小时前
C++ STL CookBook
开发语言·c++·stl·c++20