QT-正则表达式QRegExp
2015年1月10日
QRegExp是以Perl的正则表达式为基础发展来的。可以使用简单的通配符匹配,或者纯字符匹配,也可以使用正则表达式匹配。使用setPatternSyntax()可以切换不同的匹配模式。
使用exactMatch()验证字符串是否符合指定格式。
匹配模式:RegExp,RegExp2,Wildcard,WildcardUnix,FixedString,W3CXmlSchema11。
参考:http://blog.csdn.net/c05170519/article/details/6873440
默认模式。类似Perl格式的正则表达式。
RegExp2模式与RegExp类似,但是使用最小分组匹配来获取匹配字符串。
注意:在具有\的格式时,需要使用\\来转义。
1) 简单单个字符:纯字符。
2) 字符集中单个字符:【】表示指定字符集中单个字符(格式:字符集合,或-表示范围,或^表示排除)。可以使用快捷匹配字符(参见:快捷字符:使用一个自定义的转义字符来代替常用的模式字符串。)。如果需要使用utf8(如汉字)可以使用\u编码(参见只包含汉字的字符串。)的方式,utf8的编码可以网络查找,如http://utf8.supfree.net/ 。
示例:
a[^3]2.txt表示a2中间任意不同于3的一个字符(无字符为false),
[0-9-]表示0到9或负号-。
3) 数量字符:至少n个:E{n,},至多n个:E{,m},存在n个至m个:E{n,m}。确定数量字符E{}。默认返回最多匹配字符,使用setMinimal()则返回最少匹配字符串。
4) 开始字符:^
5) 结束字符:$
1) or:|表示或者。
2) 分组、捕获:(E)表示括号内的模式为一个基本模式,可以捕获。
3) 分组、不捕获:(?:E)表示括号内的模式为一个基本模式,不可捕获。
4) 分组中捕获值:(\m)。m是捕获的第m个分组值。
5) 肯定匹配:E(?=RegExp)查找E,其指定位置是RegExp。
6) 否定匹配:E(?!RegExp)=查找E,其指定位置不是RegExp。
1) 数字、非数字:\d=【0-9】,\D=[^0-9]。
2) 字母或数字或下划线、非字母或数字或下划线或:\w=【A-Za-z0-9_】,\W=【^A-Za-z0-9_】。
3) 空白字符、非空白字符:\s=【 \t\r\n】,\S=【^ \t\r\n】。
4) 任意字符(包括换行):.
5) ACSII转换字符:\a\f….
1) 开始或结束、中间位置:\b=^|$,\B。
1) 不存在或存在1个:E?={0,1}
2) 存在至少一个:E+={1,}
3) 存在0个或多个:E*={0,}
void regExp()
{
QRegExp r;
r.setPatternSyntax (QRegExp::RegExp);
r.setPattern ("a.txt");
bool bValid = r.exactMatch("a.txt");
qDebug()<<"a="<<bValid;
r.setPattern ("a[^3]2.txt");
bValid = r.exactMatch("a32.txt");
qDebug()<<"a[^3]2"<<bValid;
bValid = r.exactMatch("a42.txt");
qDebug()<<"a[^3]2"<<bValid;
bValid = r.exactMatch ("a2.txt");
qDebug()<<"a[^3]2"<<bValid;
r.setPattern ("a{2,4}");
bValid = r.exactMatch ("a");
qDebug()<<"a{2,4}"<<bValid;
bValid = r.exactMatch ("aa");
qDebug()<<"a{2,4}"<<bValid;
bValid = r.exactMatch ("aaaa");
qDebug()<<"a{2,4}"<<bValid;
bValid = r.exactMatch ("aaaaaa");
qDebug()<<"a{2,4}"<<bValid;
}
//结果
a= true
a[^3]2 false
a[^3]2 true
a[^3]2 false
a{2,4} false
a{2,4} true
a{2,4} true
a{2,4} false
WildcardUnix:使用\作为转义字符标志,其它与Wildcard模式相同。
?:单个字符。
*:任意字符。
【】:指定单个字符(格式:字符集合,或-表示范围,或^表示排除)。示例:a[^3]2.txt表示a2中间任意不同于3的一个字符(无字符为false)。
void wildcard()
{
QRegExp r;
r.setPatternSyntax (QRegExp::Wildcard);
r.setPattern ("a?2.txt");
boolbValid = r.exactMatch ("ab2.txt");
qDebug()<<"?="<<bValid;
r.setPattern ("a*2.txt");
bValid = r.exactMatch ("abcd232.txt");
qDebug()<<"*="<<bValid;
r.setPattern ("a[^3]2.txt");
bValid = r.exactMatch ("a32.txt");
qDebug()<<"a[^3]2"<<bValid;
bValid = r.exactMatch ("a42.txt");
qDebug()<<"a[^3]2"<<bValid;
bValid = r.exactMatch ("a2.txt");
qDebug()<<"a[^3]2"<<bValid;
}
//结果:
?= true
*= true
a[^3]2 false
a[^3]2 true
a[^3]2 false
仅将模式字符串作为纯属字符串,不再进行正则运算。
void fixedString()
{
QRegExp r;
r.setPatternSyntax (QRegExp::FixedString);
r.setPattern ("a?2.txt");
boolbValid = r.exactMatch ("ab2.txt");
qDebug()<<"?="<<bValid;
bValid = r.exactMatch ("a?2.txt");
qDebug()<<"?="<<bValid;
r.setPattern ("a*2.txt");
bValid = r.exactMatch ("abcd232.txt");
qDebug()<<"*="<<bValid;
bValid = r.exactMatch ("a*2.txt");
qDebug()<<"*="<<bValid;
r.setPattern ("a[^3]2.txt");
bValid = r.exactMatch ("a[^3]2.txt");
qDebug()<<"a[^3]2"<<bValid;
bValid = r.exactMatch ("a42.txt");
qDebug()<<"a[^3]2"<<bValid;
}
//结果
?= false
?= true
*= false
*= true
a[^3]2 true
a[^3]2 false
目标:获取测试字符串中匹配模式字符串的值。
原理:整个模式作为索引0字符串。
如果使用()进行分组捕获,分组索引从1开始。
方法:
获取第n组匹配的字符串值:cap(n)。
获取所有匹配的字符串值列表:captureTextes()。
匹配数量:captureCount()。
第n给匹配的位置:pos(n)。
方法:使用【】字符集,[a-zA-Z0-9-]+表示至少一个字母、数字或-。
\u7532\u4E59\u4E19\u4E01表示甲乙丙丁的四个汉字的utf8编码。
只有完全匹配的才能通过验证。
示例:
QRegExp reg("[A-Z0-9\u7532\u4E59\u4E19\u4E01-]+");
if(false == reg.exactMatch (strText)){
return;
}
方法:使用【】字符集,使用utf8编码指定汉字范围[\u4e00-\u9fa5a]+。
示例:
QRegExp reg("[\u4e00-\u9fa5a]+");
if(false == reg.exactMatch (strText)){
return;
}
参考:http://www.cppblog.com/biao/archive/2012/03/04/167118.html
方法:只能输入字母、数字、()[]()、甲乙丙丁、-
注意:【】使用\\[\\]来表示。
参考:
http://stackoverflow.com/questions/928072/whats-the-regular-expression-that-matches-a-square-bracket
示例:
QRegExp reg("[a-zA-Z0-9()\\[\\]\uFF08\uFF09\u7532\u4E59\u4E19\u4E01-]+");
if(false == reg.exactMatch (strText)){
return;
}
删除不是数字和字母的字符
示例:
strStdCode.remove(QRegExp("[^a-zA-Z0-9]"));//remove notdigital and letter
方法:cap()可以捕获()内的字符串,使用?:指定不捕获。整个字符串捕获索引为0,()内的从1开始。
indexIn()返回查找到的原始字符串索引值。
示例:
QStringQOldMapFrame::convert100wRowNum2Letter(const QString &strMapFrame)
{
QStringList lstMapFrame = strMapFrame.split("-");
QString str100wRowNum = lstMapFrame[0];
QRegExpreg("(?:[NS]?)(\\d+)",Qt::CaseInsensitive);
if(-1!=reg.indexIn (str100wRowNum))
{
QString strRowNum = reg.cap (1);
QString strRowLetter = strRowNum.toInt()-1+'A';
str100wRowNum.replace(strRowNum,strRowLetter);
lstMapFrame[0] = str100wRowNum;
}
return lstMapFrame.join ("-");
}
如:Nj-50-013=j50-013=nj-50-013
QString strArg = “-mapframe_file_list \"D:/新建 文件夹/mapframe.txt\"-l 7”
QRegExp reg("(\\S+)");//notspace
int pos=0;
while ((pos = reg.indexIn(strArg, pos))!= -1)
{
lstArg << reg.cap(1);
pos += reg.matchedLength();
}
结果
-mapframe_file_list
"D:/新建
文件夹/mapframe.txt"
-l
7
QString strArg = “-mapframe_file_list \"D:/新建 文件夹/mapframe.txt\"-l 7”
QRegExpreg("(\".*\")");//"reg"
int pos=0;
while ((pos = reg.indexIn(strArg, pos))!= -1)
{
lstArg << reg.cap(1);
pos += reg.matchedLength();
}
结果:
"D:/新建 文件夹/mapframe.txt"
QString strArg = “-mapframe_file_list \"D:/新建 文件夹/mapframe.txt\"-l 7”
QRegExpreg("((\\S+)|(\".*\"))");//not space
int pos=0;
while ((pos = reg.indexIn(strArg, pos))!= -1)
{
lstArg << reg.cap(1);
pos += reg.matchedLength();
}
结果:
-mapframe_file_list
"D:/新建 文件夹/mapframe.txt"
-l
7
示例:
QRegExpreg("([nNsS]?)([a-zA-Z])(\\d{1,2})([a-zA-Z]?)(\\d{0,3})(\\d{0,3})");
QStringList lst;
int pos=0;
while ((pos = reg.indexIn(currentText,pos)) != -1)
{
reg.captureCount ();
for(int i =1;i<reg.captureCount()+1;++i)
{
lst << reg.cap(i);
}
qDebug()<<lst;
pos += reg.matchedLength ();
}
结果:
nj50b001002->("n","j", "50", "b", "001", "002")
j50b001003->("", "j", "50", "b", "001","003")
j50->("","j", "50", "", "", "")