Qt——正则表达式
源地址:http://www.cnblogs.com/hellovenus/p/4984751.html
在项目中经常会遇到对字符串进行操作的情况,我们可以直接使用QString的一些函数,但QT提供了一个更加强大的类——QRegExp,使用正则表达式来操作字符串。 先说说我最近遇到的几个问题: 1.对输入框LineEdit中的输入内容加以限制,比如只能输入数字,并且最多5位数(因为int类型不限制位数会导致溢出问题); 2.检查输入是否正确,比如判断是否是1-9999之间的数; 3.获取一个字符串中的一段内容,比如获取2015-11-20中的2015。 为了解决这些问题,下面先看看正则表达式的基本知识。
一、基本知识正则表达式(Regular Expression,通常简写为RegExp、RE等),预先定义一些字符或字符的组合,用于匹配文本中的一段字符串。下面是它的一些用途—— 1.验证 判断字符串是否符合某个标准,比如“是一个整数”或者“没有空格”。 2.搜索 正则表达式提供了比普通字符串匹配更为强大的匹配方式,比如匹配下面的词语:mail,letter,correspondence,但是不包括email,mailman,letterbox等等。 3.查找并替换 正则表达式能够用一个不同的字符串,替换所有出现另一个字符串的地方,比如用&替换&,如果原先&后面已经有了amp;那么不替换。 4.分割字符串 比如,根据tab来分割字符串。 使用正则表达式首先需要了解一些符号的作用,比如d用来匹配数字,下面结合一些例子说明。
注意:C++编译器会对反斜杠进行转换,要想在正则表达式中包括一个,需要输入两次,例如s。要想匹配反斜杠本身,需要输入4次,比如\。 二、在QT中的用法 1.对用户输入的限制void QLineEdit::setValidator(const QValidator * v)QLineEdit中的这个函数意思是,令LineEidt只接受验证器 v 所匹配的输入,你可以对要输入的内容进行任意的限制。 比如:限制输入框只能输入0到99999
2.检查输入是否符合格式QValidator::State QRegExpValidator::validate(QString & input,int & pos) const如果输入与正则表达式相匹配,则返回Acceptable;如果部分匹配,则返回Intermediate(部分匹配,意思是如果给它增加额外的字符则能够匹配正则表达式);如果不匹配则返回Invalid。 enum QValidator::State这个枚举类型说明了被验证的字符串是哪种类型。 QValidator::Invalid:值为0,表示字符串完全不匹配; QValidator::Intermediate:值为1,表示部分匹配; QValidator::Acceptable:值为2,表示完全匹配。 // integers 1 to 9999
QRegExp rx(
"[1-9]d{0,3}"
);
// the validator treats the regexp as "^[1-9]d{0,3}$"
QRegExpValidator v(rx,0);
QString s;
int
pos = 0;
s =
"0"
; v.validate(s,pos);
// returns Invalid
"12345"
// returns Invalid
"1"
// returns Acceptable
rx.setPattern(
"S+"
);
// one or more non-whitespace characters
v.setRegExp(rx);
"myfile.txt"
// Returns Acceptable
"my file.txt"
// Returns Invalid
// A,B or C followed by exactly five digits followed by W,X,Y or Z
"[A-C]d{5}[W-Z]"
);
v.setRegExp(rx);
"a12345Z"
// Returns Invalid
"A12345Z"
// Returns Acceptable
"B12"
// Returns Intermediate
// match most 'readme' files
"readS?me(.(txt|asc|1st))?"
);
rx.setCaseSensitive(
false
);
v.setRegExp(rx);
"readme"
// Returns Acceptable
"README.1ST"
// Returns Acceptable
"read me.txt"
// Returns Invalid
"readm"
// Returns Intermediate
|
^[0-9]+3c$
看上面的表达式,开头的^表示必须以[0-9]+开头,结尾的$表示必须以字母c结尾,如果输入的是123a,则返回QValidator::Intermediate,表示部分匹配,如果输入的是233abc,则完全匹配。
3.截取字符串
QString QRegExp::cap(int nth = 0) const
这个函数返回被第n个子表达式捕获的文本,整个匹配拥有下标0,带括号的子表达式下标从1开始。
"(d+)(?:s*)(cm|inch)"
);
pos = rxlen.indexIn(
"Length: 189cm"
);
if
(pos > -1) {
QString value = rxlen.cap(1);
// "189"
QString unit = rxlen.cap(2);
// "cm"
// ...
}