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);
}