通俗易懂玩QT:正则表达式 QRegularExpression 学习

正则表达式 QRegularExpression 学习

在 Qt 中有两种和正则相关的类,一种是 QRegExp 类,今天查资料说的好像是从 Qt4 传承下来的,BUG 相对来说比较多,目前基本已停止维护了,多用于正则匹配,还有一种就是今天要讲的 QRegularExpression 类,是 Qt5 新开辟出来的类,相对来说比较完善(网上这样说的,具体有待考证),从 5.0 版本就引入的一个新类(这个在官方文档有说明,已证实),有正则匹配功能,同 QRegularExpressionMatch 类与 QRegularExpressionMatchIterator 类一同使用,具备字符串截取功能(这是今天讲的重点)。

一、判断正则表达是是否有效

isValid() 是 QRegularExpression 类判断正则表达式是否有效的方法

QRegularExpression::isValid() 方法返回值为布尔(bool)类型,true 为表达式有效,false 则为无效,常用方法如下:

//以下的代码为官方提供,放在这里可以参考
QRegularExpression invalidRe("(unmatched|parenthesis");
if (!invalidRe.isValid()) {
    QString errorString = invalidRe.errorString(); // errorString == "missing )"
    int errorOffset = invalidRe.patternErrorOffset(); // errorOffset == 22
    // ...
}

二、正则表达式的匹配比较

QRegularExpression 类的正则匹配需要两个类来配合完成,这两个类就是之前提到的 QRegularExpressionMatch 类与 QRegularExpressionMatchIterator 类,前者提供单一匹配机制,一般多用于比较与单一数据提取,后者提供多重匹配机制,一般多用于多重数据提取

1)QRegularExpression 类与 QRegularExpressionMatch 类搭配使用,提供单一匹配比较,使用方法如下:

//以下的代码为官方提供,放在这里可以参考
QRegularExpression re("\\d\\d \\w+");
QRegularExpressionMatch match = re.match("abc123 def");
bool hasMatch = match.hasMatch(); // true

2)QRegularExpression 类与 QRegularExpressionMatch 类搭配使用,提供单一匹配比较与数据提取(多组数据时,可指定数据组数),使用方法如下:

//以下的代码为官方提供,放在这里可以参考
//1.通过QRegularExpression 类 match 方法(第二个参数未填,默认提取第一组数据),比较并提取第一组数据
QRegularExpression re("\\d\\d \\w+");
QRegularExpressionMatch match = re.match("abc123 def");
if (match.hasMatch()) {
    QString matched = match.captured(0); // matched == "23 def"
    // ...
}

//2.通过QRegularExpression 类 match 方法的第二个参数进行数据偏移,比较并提取第N组数据(经测试,该方法不可靠,不过也许是我使用的方式方法不对造成的)
QRegularExpression re("\\d\\d \\w+");
QRegularExpressionMatch match = re.match("12 abc 45 def", 1);
if (match.hasMatch()) {
    QString matched = match.captured(0); // matched == "45 def"
    // ...
}

3)QRegularExpression 类与 QRegularExpressionMatch 类搭配使用,提供单一匹配比较与数据提取的同时,也提供了数据分段提取方法,使用方式如下:

//以下的代码为官方提供,放在这里可以参考
//1.通过小括号分隔数据,然后通过地址偏移提取这组数据中不同的数据段
QRegularExpression re("^(\\d\\d)/(\\d\\d)/(\\d\\d\\d\\d)$");
QRegularExpressionMatch match = re.match("08/12/1985");
if (match.hasMatch()) {
    QString day = match.captured(1); // day == "08"
    QString month = match.captured(2); // month == "12"
    QString year = match.captured(3); // year == "1985"
    // ...
}

//2.通过小括号分隔数据,然后通过 `?<数据段名称>` 来指定每隔数据段的名称,然后通过 QRegularExpressionMatch 类的 captured 方法与数据段段名称直接定位数据段提取数据
QRegularExpression re("^(?<date>\\d\\d)/(?<month>\\d\\d)/(?<year>\\d\\d\\d\\d)$");
QRegularExpressionMatch match = re.match("08/12/1985");
if (match.hasMatch()) {
    QString date = match.captured("date"); // date == "08"
    QString month = match.captured("month"); // month == "12"
    QString year = match.captured("year"); // year == 1985
}

4)QRegularExpression 类与 QRegularExpressionMatch 类搭配使用,提供单一匹配比较与数据提取的同时,还提供了每组数据的起始位置与结束位置,使用方式如下:

//以下的代码为官方提供,放在这里可以参考
QRegularExpression re("abc(\\d+)def");
QRegularExpressionMatch match = re.match("XYZabc123defXYZ");
if (match.hasMatch()) {
    int startOffset = match.capturedStart(1); // startOffset == 6
    int endOffset = match.capturedEnd(1); // endOffset == 9
    // ...
}

5)QRegularExpression 类与 QRegularExpressionMatchIterator 类搭配使用,提供多重匹配比较与数据提取,使用方法如下:

//以下的代码为官方提供,放在这里可以参考
QRegularExpression re("(\\w+)");
QRegularExpressionMatchIterator i = re.globalMatch("the quick fox");
QStringList words;
while (i.hasNext()) {
    QRegularExpressionMatch match = i.next();
    QString word = match.captured(1);
    words << word;
}
// words contains "the", "quick", "fox"

学习分享,一起成长!以上为小编的经验分享,若存在不当之处,请批评指正!

  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 《正则表达式必知必会修订版》是一本介绍正则表达式的经典教程,其通过简单易懂的语言和大量实例来讲解正则表达式的基本语法、常用元字符、匹配原理等知识点,适合初学者学习。而此次修订版则在原基础上进行了一定的更新和完善,包括增加了一些新的实例和案例,更加详细地解释了一些重要的概念和技巧,使得读者可以更加准确地掌握正则表达式的使用方法,并且更好地应用到实际的编程工作中。 总的来说,《正则表达式必知必会修订版》是一本非常好的学习资料,无论是从基础入门到深入掌握,都能够满足读者的需求。对于初学者来说,可以通过该书快速掌握正则表达式的基本语法,然后结合实例进行练习,掌握正则表达式的初步应用。对于进阶学习者,可以从更深入的角度去学习正则表达式的应用,探索更加高级的技巧和应用场景,提高编程能力。 总之,《正则表达式必知必会修订版》是一本非常优秀的正则表达式入门教程,它具有简单易懂,知识点全面,实用性强的特点,是广大编程爱好者学习正则表达式的一本不可多得的好书。 ### 回答2: 正则表达式必知必会修订版pdf 是一本非常好的正则表达式教材,适合初学者和进阶者。首先,本书的语言简洁明了,通俗易懂,作者使用了大量实例和练习,帮助读者理解和掌握正则表达式的基础知识和进阶技巧。其次,本书的内容全面、系统,覆盖了正则表达式的所有方面,包括元字符、字符集、量词、分组、反向引用、零宽度断言等等。读者可以根据自己的需求和程度选择阅读,打好基础,完善技能。最后,本书的价值在于它能够让读者真正理解和应用正则表达式,提升工作效率。正则表达式是一种强大的文本匹配工具,它能够对文本进行高效率、精准匹配,解决企业中的一些文本处理难题,如批量修改、提取数据等。如果您是一名程序员或数据分析师,正则表达式必知必会修订版pdf一定是您的必备书籍之一,它能帮助您提升工作效率,打造更优秀的代码和应用。 ### 回答3: 正则表达式必知必会修订版pdf是一本对于正则表达式入门的学习者来讲十分有用的书籍,它详细地介绍了正则表达式的基础知识、语法和常用的应用方式。 在该书中,作者通过生动的例子和详细的讲解,引导读者逐步学习掌握正则表达式的语法和编写方式,让读者具备在处理文本数据时运用正则表达式的能力,并且能够有效地解决实际应用中遇到的问题。 此外,该书也涵盖了常用的正则表达式引擎和语言,比如Perl、Java、JavaScript等,并对常见的正则表达式应用进行了讲解,比如在表单验证、数据清洗和日志分析等领域中的应用。 总之,正则表达式必知必会修订版pdf对于初学者来说是一本非常实用的工具书,它不仅可以帮助人们学习和掌握正则表达式的基础知识,也可以帮助人们在实际应用中更加有效地运用正则表达式来提高工作效率和解决实际问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是混子我怕谁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值