Qt扫盲

您所在的位置:网站首页 正则匹配短信验证码怎么设置出来 Qt扫盲

Qt扫盲

#Qt扫盲| 来源: 网络整理| 查看: 265

QRegularExpression 理论使用总结 一、概述二、介绍三、模式选项四、匹配类型和匹配选项五、正常的匹配1. 提取捕获的子字符串 六、全局匹配七、部分匹配1. 验证用户输入2. 增量/为多段匹配 八、错误处理九、不支持perl兼容的正则表达式特性十、QRegExp用户的注意事项1. 不同的模式语法2. 从QRegExp::exactMatch()移植3. Global匹配4. 支持Unicode属性5. 通配符匹配6. 其他模式语法7. 最小的匹配 十一、调试使用QRegularExpression的代码

一、概述

正则表达式(regep)是处理字符串和文本的强大工具。在许多情况下使用的非常多,就比如在QString 的一些函数API接口参数都是可以传入 正则表达式的,正则表达式的使用场景有如下几种,例如:

验证 regexp可以测试子字符串是否满足某些条件,例如是整数或不包含空格。搜索 regexp提供了比简单子字符串匹配更强大的模式匹配,例如,匹配单词mail、letter或correspondence中的一个,但不匹配单词email、mailman、mailer、letterbox等。搜索和替换 regexp可以用不同的子字符串替换所有出现的子字符串,例如,用替换所有出现的&;除了&后面已经跟着一个amp;字符串分割 regexp可用于标识字符串应该在何处分割,例如分割制表符分隔的字符串。

本文档并不是使用正则表达式进行模式匹配的完整参考,以下部分将要求读者对类perl正则表达式及其模式语法有一些基本知识。

基础的知识可以看 菜鸟教程的正则表达式

https://www.runoob.com/regexp/regexp-syntax.html

在这里插入图片描述

二、介绍

QRegularExpression实现了perl兼容的正则表达式。它完全支持Unicode。有关QRegularExpression支持的正则表达式语法的概述,请参阅前面提到的pcrepattern(3)手册页。正则表达式由两部分组成:一个模式字符串和一组改变模式字符串含义的模式选项。 你可以通过向QRegularExpression构造函数传递一个字符串来设置模式字符串:

QRegularExpression re("a pattern");

这将模式字符串设置为一个模式。还可以使用setPattern()函数在一个已存在的QRegularExpression对象上设置模式:

QRegularExpression re; re.setPattern("another pattern");

注意,根据c++字符串字面量规则,必须用另一个反斜杠转义模式字符串中的所有反斜杠:

// matches two digits followed by a space and a word QRegularExpression re("\\d\\d \\w+"); // matches a backslash QRegularExpression re2("\\\\");

pattern() 函数返回QRegularExpression对象当前设置的模式:

QRegularExpression re("a third pattern"); QString pattern = re.pattern(); // pattern == "a third pattern" 三、模式选项

可以通过设置一个或多个模式选项来修改模式字符串的含义。例如,可以通过设置QRegularExpression:: caseinsensitive选项来设置模式不区分大小写。

你可以将这些选项传递给QRegularExpression构造函数,如下所示:

// matches "Qt rocks", but also "QT rocks", "QT ROCKS", "qT rOcKs", etc. QRegularExpression re("Qt rocks", QRegularExpression::CaseInsensitiveOption);

或者,你可以在一个已经存在的QRegularExpressionObject上使用setPatternOptions()函数:

QRegularExpression re("^\\d+$"); re.setPatternOptions(QRegularExpression::MultilineOption); // re matches any line in the subject string that contains only digits (but at least one)

使用patternOptions()函数可以获得QRegularExpression对象当前设置的模式选项:

QRegularExpression re = QRegularExpression("^two.*words$", QRegularExpression::MultilineOption | QRegularExpression::DotMatchesEverythingOption); QRegularExpression::PatternOptions options = re.patternOptions(); // options == QRegularExpression::MultilineOption | QRegularExpression::DotMatchesEverythingOption

有关每个模式选项的更多信息,请参阅QRegularExpression::PatternOption enum文档。

四、匹配类型和匹配选项

match() 和 globalMatch() 函数的最后两个参数设置了匹配类型和匹配选项。match类型是QRegularExpression::MatchType enum的值;使用NormalMatch匹配类型(默认值)选择“传统”匹配算法。还可以启用正则表达式对主题字符串的部分匹配:详细信息请参阅部分匹配部分。

匹配选项是一个或多个QRegularExpression::MatchOption值的集合。它们改变了正则表达式与主题字符串的特定匹配方式。请参阅QRegularExpression::MatchOption枚举文档了解更多细节。

五、正常的匹配

要进行匹配,只需调用match()函数,传入一个要匹配的字符串。我们把这个字符串称为主题字符串。match()函数的结果是一个QRegularExpressionMatch对象,可用于检查匹配的结果。例如:

// match two digits followed by a space and a word QRegularExpression re("\\d\\d \\w+"); QRegularExpressionMatch match = re.match("abc123 def"); bool hasMatch = match.hasMatch(); // true

如果匹配成功,(隐式的)捕获组编号0可以用来检索整个模式匹配的子字符串(参见提取捕获子字符串部分):

QRegularExpression re("\\d\\d \\w+"); QRegularExpressionMatch match = re.match("abc123 def"); if (match.hasMatch()) { QString matched = match.captured(0); // matched == "23 def" // ... }

也可以将偏移量作为参数传递给match()函数,让匹配从主题字符串中的任意偏移量开始。在下例中,不匹配“12abc”,因为匹配从偏移量1开始:

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" // ... } 1. 提取捕获的子字符串

QRegularExpressionMatch对象还包含模式字符串中捕获组捕获的子字符串的信息。captured()函数将返回第n个捕获组捕获的字符串:

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" // ... }

模式中的捕获组从1开始编号,隐式捕获组0用于捕获与整个模式匹配的子串。 也可以使用capturedStart()和capturedEnd()函数来取得每个捕获的子字符串的起始和结束偏移量(在主题字符串中):

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 // ... }

所有这些函数都有一个重载,以QString作为参数,以便提取命名的捕获子字符串。例如:

QRegularExpression re("^(?\\d\\d)/(?\\d\\d)/(?\\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 } 六、全局匹配

全局匹配在查找给定正则表达式在主题字符串中的所有出现情况时非常有用。假设我们想从给定字符串中提取所有的单词,其中单词是匹配模式\w+的子字符串。 QRegularExpression::globalMatch返回一个QRegularExpressionMatchIterator对象,这是一个类似java的前向迭代器,可用于迭代结果。例如:

QRegularExpression re("(\\w+)"); QRegularExpressionMatchIterator i = re.globalMatch("the quick fox");

由于它是一个类java的迭代器,QRegularExpressionMatchIterator将指向第一个结果的前面。每个结果都以QRegularExpressionMatch对象的形式返回。如果至少有一个结果,hasNext()函数将返回true,而next()将返回下一个结果并推进迭代器。继续前面的例子:

QStringList words; while (i.hasNext()) { QRegularExpressionMatch match = i.next(); QString word = match.captured(1); words


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3