QT--中的正则表达式的详解

43 篇文章 8 订阅
 
Qt中有两个不同类的正则表达式.
   -第一类为元字符.它表示一个或多个常量表达式.
   -令一类为 转义字符,它代表一个特殊字符.  
 
1 元字符
. 匹配任意单个字符.例如, 1.3 可能是1. 后面跟任意字符,再跟3
^ 匹配字符串首. 例如, ^12可能是123,但不能是312
$ 配字符串尾. 例如, 12$可以是312, 当不能是 123
[] 匹配括号内输入的任意字符.[123]可以为1, 2 或3
* 匹配任意数量的前导字符. 例如, 1*2可以为任意数量个1(甚至没有), 后面跟一个2
+ 匹配至少一个前导字符. 例如, 1+2必须为一个或多个1, 后跟一个2
? 匹配一个前导字符或为空. 例如 1?2可以为2或这12
 
2)统配模式
通过QRegExp::setPatternSyntax(QRegExp::Wildcard);可以将元字符设置为统配模式.在统配模式下,只有3个元字符可以使用.他们的功能没有变化.
? 匹配任意单个字符, 例如, 1?2可以为1,后面跟任意单个字符, 再跟2
* 匹配任意一个字符序列. 例如, 1*2, 可以为1, 后面跟任意数量的字符, 再跟一个2
[] 匹配一个定义的字符集合. 例如, [a-zA-Z\.]可以匹配 a到z之间任意一个字符和.[^a]匹配出小写a以外的字符.
 
3)转义序列
 
    \.匹配”.”
    \^匹配”^”
    \$匹配”$”
    \[匹配"["
    \]匹配”]”
    \*匹配”*”
    \+匹配”+”
    \?匹配”?”
     \b匹配响铃字符,使计算机发出嘟的一声.
     \t制表符号\n 换行符号
     \r回车符鉿 
     \s任意空格
     \xnn匹配16进制为nn的字符
     \0nn匹配8进制的nn字符
   这些表达式均以\开始,与C++的转义字符相同,所以为了定义QRegExp中的一个转义序列,需要在前面添加两个\\

一、QRegExp类的构造函数
   -默认构造函数,QRegExp(),产生一个空的正则表达式对象。
   -拷贝构造函数,QRegExp(const QRegExp& patten)
   -模式构造函数,QRegExp ( const QString & pattern,Qt::CaseSensitivity cs = Qt::CaseSensitive, PatternSyntax syntax =RegExp),产生指定匹配模式的正则表达式对象。
 
二、可以获得正则表达式对象的信息和匹配信息
 
1 isValid(),判断正则表达式是否合法,合法返回true,否则返回false。
   例如:QRegExpexp1("c[9]");  
   boolvalid=exp1.isValid();//返回true  
   QRegExpexp1("c[9");  
   boolvalid=exp1.isValid();//返回false  
 
2)errorString()检查正则是否有错误,
 
3)isEmpty(),判断正则是否为空,当采用默认构造函数生成正则时,此函数返回true,否则返回false。
QRegExp exp1;
bool valid=exp1.isEmpty();//返回true
 
4) caseSensitivity () 看正则是否大小写敏感。
 
5) cap(),capturedTexts ()前者获得捕捉的每一项,index从1开始,后者则获得整个捕捉列表。
 
6) exactMatch(QString),返回是否整串匹配,匹配一部分也返回false。
 
7) indexIn(),进行匹配,如果成功则返回index,不成功返回-1
 
8) matchedLength(),返回匹配的串的长度。
 
9) numCaptures(),获得正则里捕捉项的个数。
 
10) pattern(),获得正则本身
 
11) patternSyntax()
enum PatternSyntax { RegExp, RegExp2, Wildcard, FixedString }默认为RegExp。
 
1)实例:返回查找匹配的字符位置
 
QRegExp rx("/([a-z]+)/([a-z]+)");
rx.indexIn("Output /dev/null");   // returns 7 (position of /dev/null)
rx.pos(0);                        // returns 7 (position of /dev/null)
rx.pos(1);                        // returns 8 (position of dev)
rx.pos(2);                        // returns 12 (position of null)

2)实例2
    QRegExp rx("(\\d+)");
    QString str = "Offsets: 12 14 99 231 7";
    QStringList list;
    int pos = 0;
 
 
    while ((pos = rx.indexIn(str, pos)) != -1) {
    list << rx.cap(1);
    pos += rx.matchedLength();
}
// list: ["12", "14", "99", "231", "7"]

3)实例3 精确查找
QRegExp rx("*.txt");
rx.setPatternSyntax(QRegExp::Wildcard);
rx.exactMatch("README.txt");        // returns true
rx.exactMatch("welcome.txt.bak");   // returns false

4)实例4 获取一个字符串里面的特殊字符
QString str = "Digia Plc\tqt.digia.com\tFinland";
QString company, web, country;
rx.setPattern("^([^\t]+)\t([^\t]+)\t([^\t]+)$");
if (rx.indexIn(str) != -1) {
    company = rx.cap(1);
    web = rx.cap(2);
    country = rx.cap(3);
}


 



  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值