179人参与 • 2024-08-02 • 正则表达式
在 qt 中有两种和正则相关的类,一种是 qregexp 类,今天查资料说的好像是从 qt4 传承下来的,bug 相对来说比较多,目前基本已停止维护了,多用于正则匹配,还有一种就是今天要讲的 qregularexpression 类,是 qt5 新开辟出来的类,相对来说比较完善(网上这样说的,具体有待考证),从 5.0 版本就引入的一个新类(这个在官方文档有说明,已证实),有正则匹配功能,同 qregularexpressionmatch 类与 qregularexpressionmatchiterator 类一同使用,具备字符串截取功能(这是今天讲的重点)。
qregularexpression::isvalid() 方法返回值为布尔(bool)类型,true 为表达式有效,false 则为无效,常用方法如下:
//以下的代码为官方提供,放在这里可以参考
qregularexpression invalidre("(unmatched|parenthesis");
if (!invalidre.isvalid()) {
qstring errorstring = invalidre.errorstring(); // errorstring == "missing )"
int erroroffset = invalidre.patternerroroffset(); // erroroffset == 22
// ...
}
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"
学习分享,一起成长!以上为小编的经验分享,若存在不当之处,请批评指正!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论