QT-正则表达式QRegExp

前端之家收集整理的这篇文章主要介绍了QT-正则表达式QRegExp前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

QT-正则表达式QRegExp@H_301_3@

sf2gis@163.com@H_301_3@

2015年1月10日@H_301_3@

@H_301_3@

1目的:字符串模式匹配及操作。

2原理:通过模式字符串,查找相应的字符串索引。与QString配合,验证、查找、修改、替换、截取等操作字符串。

3方法:QRegExp

QRegExp是以Perl的正则表达式为基础发展来的。可以使用简单的通配符匹配,或者纯字符匹配,也可以使用正则表达式匹配。使用setPatternSyntax()可以切换不同的匹配模式。@H_301_3@

使用exactMatch()验证字符串是否符合指定格式。@H_301_3@

匹配模式:RegExp,RegExp2,Wildcard,WildcardUnix,FixedString,W3CXmlSchema11。@H_301_3@

参考:http://www.jb51.cc/article/p-afzzenhl-qz.html@H_301_3@

3.1 正则表达式匹配:QRegExp::setPatternSyntax(QRegExp::RegExp)

默认模式。类似Perl格式的正则表达式。@H_301_3@

RegExp2模式与RegExp类似,但是使用最小分组匹配来获取匹配字符串。@H_301_3@

3.1.1模式字符串格式

注意:在具有\的格式时,需要使用\\来转义。@H_301_3@

3.1.1.1 基本字符模式

1) 简单单个字符:纯字符。@H_301_3@

2) 字符集中单个字符:【】表示指定字符集中单个字符(格式:字符集合,或-表示范围,或^表示排除)。可以使用快捷匹配字符(参见:快捷字符:使用一个自定义的转义字符来代替常用的模式字符串。)。如果需要使用utf8(如汉字)可以使用\u编码(参见只包含汉字的字符串。)的方式,utf8的编码可以网络查找,如http://utf8.supfree.net/ 。@H_301_3@

示例:@H_301_3@

a[^3]2.txt表示a2中间任意不同于3的一个字符(无字符为false),@H_301_3@

[0-9-]表示0到9或负号-。@H_301_3@

3) 数量字符:至少n个:E{n,},至多n个:E{,m},存在n个至m个:E{n,m}。确定数量字符E{}。默认返回最多匹配字符,使用setMinimal()则返回最少匹配字符串。@H_301_3@

4) 开始字符:^@H_301_3@

5) 结束字符:$@H_301_3@

3.1.1.2 逻辑控制字符(断言字符)

1) or:|表示或者。@H_301_3@

2) 分组、捕获:(E)表示括号内的模式为一个基本模式,可以捕获。@H_301_3@

3) 分组、不捕获:(?:E)表示括号内的模式为一个基本模式,不可捕获。@H_301_3@

4) 分组中捕获值:(\m)。m是捕获的第m个分组值。@H_301_3@

5) 肯定匹配:E(?=RegExp)查找E,其指定位置是RegExp。@H_301_3@

6) 否定匹配:E(?!RegExp)=查找E,其指定位置不是RegExp。@H_301_3@

3.1.1.3 快捷匹配字符:使用一个自定义的转义字符来代替常用的模式字符串。

1) 数字、非数字:\d=【0-9】,\D=[^0-9]。@H_301_3@

2) 字母或数字或下划线、非字母或数字或下划线或:\w=【A-Za-z0-9_】,\W=【^A-Za-z0-9_】。@H_301_3@

3) 空白字符、非空白字符:\s=【 \t\r\n】,\S=【^ \t\r\n】。@H_301_3@

4) 任意字符(包括换行):.@H_301_3@

5) ACSII转换字符:\a\f….@H_301_3@

3.1.1.4 快捷位置字符

1) 开始或结束、中间位置:\b=^|$,\B。@H_301_3@

3.1.1.5 快捷数量字符

1) 不存在或存在1个:E?={0,1}@H_301_3@

2) 存在至少一个:E+={1,}@H_301_3@

3) 存在0个或多个:E*={0,}@H_301_3@

3.1.2示例

void regExp()@H_301_3@

{@H_301_3@

QRegExp r;@H_301_3@

r.setPatternSyntax (QRegExp::RegExp);@H_301_3@

r.setPattern ("a.txt");@H_301_3@

bool bValid = r.exactMatch("a.txt");@H_301_3@

qDebug()<<"a="<<bValid;@H_301_3@

r.setPattern ("a[^3]2.txt");@H_301_3@

bValid = r.exactMatch("a32.txt");@H_301_3@

qDebug()<<"a[^3]2"<<bValid;@H_301_3@

bValid = r.exactMatch("a42.txt");@H_301_3@

qDebug()<<"a[^3]2"<<bValid;@H_301_3@

bValid = r.exactMatch ("a2.txt");@H_301_3@

qDebug()<<"a[^3]2"<<bValid;@H_301_3@

r.setPattern ("a{2,4}");@H_301_3@

bValid = r.exactMatch ("a");@H_301_3@

qDebug()<<"a{2,4}"<<bValid;@H_301_3@

bValid = r.exactMatch ("aa");@H_301_3@

qDebug()<<"a{2,4}"<<bValid;@H_301_3@

bValid = r.exactMatch ("aaaa");@H_301_3@

qDebug()<<"a{2,4}"<<bValid;@H_301_3@

bValid = r.exactMatch ("aaaaaa");@H_301_3@

qDebug()<<"a{2,4}"<<bValid;@H_301_3@

}@H_301_3@

//结果@H_301_3@

a= true@H_301_3@

a[^3]2 false@H_301_3@

a[^3]2 true@H_301_3@

a[^3]2 false@H_301_3@

a{2,4} false@H_301_3@

a{2,4} true@H_301_3@

a{2,4} false@H_301_3@

3.2 通配符匹配:QRegExp::setPatternSyntax(QRegExp::Wildcard)、WildcardUnix

WildcardUnix:使用\作为转义字符标志,其它与Wildcard模式相同。@H_301_3@

3.2.1通配符:

?:单个字符。@H_301_3@

*:任意字符。@H_301_3@

【】:指定单个字符(格式:字符集合,或-表示范围,或^表示排除)。示例:a[^3]2.txt表示a2中间任意不同于3的一个字符(无字符为false)。@H_301_3@

3.2.2示例:

void wildcard()@H_301_3@

{@H_301_3@

QRegExp r;@H_301_3@

r.setPatternSyntax (QRegExp::Wildcard);@H_301_3@

r.setPattern ("a?2.txt");@H_301_3@

boolbValid = r.exactMatch ("ab2.txt");@H_301_3@

qDebug()<<"?="<<bValid;@H_301_3@

r.setPattern ("a*2.txt");@H_301_3@

bValid = r.exactMatch ("abcd232.txt");@H_301_3@

qDebug()<<"*="<<bValid;@H_301_3@

r.setPattern ("a[^3]2.txt");@H_301_3@

bValid = r.exactMatch ("a32.txt");@H_301_3@

qDebug()<<"a[^3]2"<<bValid;@H_301_3@

bValid = r.exactMatch ("a42.txt");@H_301_3@

qDebug()<<"a[^3]2"<<bValid;@H_301_3@

bValid = r.exactMatch ("a2.txt");@H_301_3@

qDebug()<<"a[^3]2"<<bValid;@H_301_3@

}@H_301_3@

//结果:@H_301_3@

?= true@H_301_3@

*= true@H_301_3@

a[^3]2 false@H_301_3@

a[^3]2 true@H_301_3@

a[^3]2 false@H_301_3@

3.3 纯字符匹配:QRegExp::setPatternSyntax(QRegExp::FixString)

仅将模式字符串作为纯属字符串,不再进行正则运算。@H_301_3@

void fixedString()@H_301_3@

{@H_301_3@

QRegExp r;@H_301_3@

r.setPatternSyntax (QRegExp::FixedString);@H_301_3@

r.setPattern ("a?2.txt");@H_301_3@

boolbValid = r.exactMatch ("ab2.txt");@H_301_3@

qDebug()<<"?="<<bValid;@H_301_3@

bValid = r.exactMatch ("a?2.txt");@H_301_3@

qDebug()<<"?="<<bValid;@H_301_3@

r.setPattern ("a*2.txt");@H_301_3@

bValid = r.exactMatch ("abcd232.txt");@H_301_3@

qDebug()<<"*="<<bValid;@H_301_3@

bValid = r.exactMatch ("a*2.txt");@H_301_3@

qDebug()<<"*="<<bValid;@H_301_3@

r.setPattern ("a[^3]2.txt");@H_301_3@

bValid = r.exactMatch ("a[^3]2.txt");@H_301_3@

qDebug()<<"a[^3]2"<<bValid;@H_301_3@

bValid = r.exactMatch ("a42.txt");@H_301_3@

qDebug()<<"a[^3]2"<<bValid;@H_301_3@

}@H_301_3@

//结果@H_301_3@

?= false@H_301_3@

?= true@H_301_3@

*= false@H_301_3@

*= true@H_301_3@

a[^3]2 true@H_301_3@

a[^3]2 false@H_301_3@

3.4 获取匹配字符串

目标:获取测试字符串中匹配模式字符串的值。@H_301_3@

原理:整个模式作为索引0字符串。@H_301_3@

如果使用()进行分组捕获,分组索引从1开始。@H_301_3@

方法:@H_301_3@

获取第n组匹配的字符串值:cap(n)。@H_301_3@

获取所有匹配的字符串值列表:captureTextes()。@H_301_3@

匹配数量:captureCount()。@H_301_3@

第n给匹配的位置:pos(n)。@H_301_3@

3.5 验证模式的有效性:isValid。

3.6 返回匹配位置:indexIn(),lastIndexIn()。

3.7 是否精确匹配:exactMatch()。

4应用

4.1 验证

4.1.1只包含英文字母、数字、-、汉字甲乙丙丁的字符串。

方法:使用【】字符集,[a-zA-Z0-9-]+表示至少一个字母、数字或-。@H_301_3@

\u7532\u4E59\u4E19\u4E01表示甲乙丙丁的四个汉字的utf8编码。@H_301_3@

只有完全匹配的才能通过验证。@H_301_3@

示例:@H_301_3@

QRegExp reg("[A-Z0-9\u7532\u4E59\u4E19\u4E01-]+");@H_301_3@

if(false == reg.exactMatch (strText)){@H_301_3@

return;@H_301_3@

}@H_301_3@

4.1.2 只包含汉字的字符串

方法:使用【】字符集,使用utf8编码指定汉字范围[\u4e00-\u9fa5a]+。@H_301_3@

示例:@H_301_3@

QRegExp reg("[\u4e00-\u9fa5a]+");@H_301_3@

if(false == reg.exactMatch (strText)){@H_301_3@

return;@H_301_3@

}@H_301_3@

参考:http://www.cppblog.com/biao/archive/2012/03/04/167118.html@H_301_3@

4.1.3验证地形图分幅编号输入是否正确

方法:只能输入字母、数字、()[]()、甲乙丙丁、-@H_301_3@

注意:【】使用\\[\\]来表示。@H_301_3@

参考:@H_301_3@

http://stackoverflow.com/questions/928072/whats-the-regular-expression-that-matches-a-square-bracket@H_301_3@

示例:@H_301_3@

QRegExp reg("[a-zA-Z0-9()\\[\\]\uFF08\uFF09\u7532\u4E59\u4E19\u4E01-]+");@H_301_3@

if(false == reg.exactMatch (strText)){@H_301_3@

return;@H_301_3@

}@H_301_3@

4.2 删除指定字符

删除不是数字和字母的字符@H_301_3@

示例:@H_301_3@

strStdCode.remove(QRegExp("[^a-zA-Z0-9]"));//remove notdigital and letter@H_301_3@

4.3 查找和捕获

方法:cap()可以捕获()内的字符串,使用?:指定不捕获。整个字符串捕获索引为0,()内的从1开始。@H_301_3@

indexIn()返回查找到的原始字符串索引值。@H_301_3@

示例:@H_301_3@

QStringQOldMapFrame::convert100wRowNum2Letter(const QString &strMapFrame)@H_301_3@

{@H_301_3@

QStringList lstMapFrame = strMapFrame.split("-");@H_301_3@

QString str100wRowNum = lstMapFrame[0];@H_301_3@

QRegExpreg("(?:[NS]?)(\\d+)",Qt::CaseInsensitive);@H_301_3@

if(-1!=reg.indexIn (str100wRowNum))@H_301_3@

{@H_301_3@

QString strRowNum = reg.cap (1);@H_301_3@

QString strRowLetter = strRowNum.toInt()-1+'A';@H_301_3@

str100wRowNum.replace(strRowNum,strRowLetter);@H_301_3@

lstMapFrame[0] = str100wRowNum;@H_301_3@

}@H_301_3@

return lstMapFrame.join ("-");@H_301_3@

}@H_301_3@

4.4 替换:地形图转换为标准格式,N(可省略)或S开头,后跟行号(数字或字母表示)后加-后加行号-列后……转换为NJ50-……

如:Nj-50-013=j50-013=nj-50-013@H_301_3@

4.5 字符串分割

4.5.1以空格分隔的字符串

QString strArg = “-mapframe_file_list \"D:/新建 文件夹/mapframe.txt\"-l 7”@H_301_3@

QRegExp reg("(\\S+)");//notspace@H_301_3@

int pos=0;@H_301_3@

while ((pos = reg.indexIn(strArg,pos))!= -1) @H_301_3@

{@H_301_3@

lstArg << reg.cap(1);@H_301_3@

pos += reg.matchedLength();@H_301_3@

}@H_301_3@

结果@H_301_3@

-mapframe_file_list @H_301_3@

"D:/新建 @H_301_3@

文件夹/mapframe.txt"@H_301_3@

-l@H_301_3@

7@H_301_3@

4.5.2双引号分隔的字符串

QString strArg = “-mapframe_file_list \"D:/新建 文件夹/mapframe.txt\"-l 7”@H_301_3@

QRegExpreg("(\".*\")");//"reg"@H_301_3@

int pos=0;@H_301_3@

while ((pos = reg.indexIn(strArg,pos))!= -1)@H_301_3@

{@H_301_3@

lstArg << reg.cap(1);@H_301_3@

pos += reg.matchedLength();@H_301_3@

}@H_301_3@

结果:@H_301_3@

"D:/新建 文件夹/mapframe.txt"@H_301_3@

4.5.3命令行参数分解:以空格 或 双引号分割的字符串

QString strArg = “-mapframe_file_list \"D:/新建 文件夹/mapframe.txt\"-l 7”@H_301_3@

QRegExpreg("((\\S+)|(\".*\"))");//not space@H_301_3@

int pos=0;@H_301_3@

while ((pos = reg.indexIn(strArg,pos))!= -1)@H_301_3@

{@H_301_3@

lstArg << reg.cap(1);@H_301_3@

pos += reg.matchedLength();@H_301_3@

}@H_301_3@

结果:@H_301_3@

-mapframe_file_list @H_301_3@

"D:/新建 文件夹/mapframe.txt"@H_301_3@

-l@H_301_3@

7@H_301_3@

4.5.4地形图图幅分解

示例:@H_301_3@

QRegExpreg("([nNsS]?)([a-zA-Z])(\\d{1,2})([a-zA-Z]?)(\\d{0,3})(\\d{0,3})");@H_301_3@

QStringList lst;@H_301_3@

int pos=0;@H_301_3@

while ((pos = reg.indexIn(currentText,pos)) != -1)@H_301_3@

{@H_301_3@

reg.captureCount ();@H_301_3@

for(int i =1;i<reg.captureCount()+1;++i)@H_301_3@

{@H_301_3@

lst << reg.cap(i);@H_301_3@

}@H_301_3@

qDebug()<<lst;@H_301_3@

pos += reg.matchedLength ();@H_301_3@

}@H_301_3@

结果:@H_301_3@

nj50b001002->("n","j","50","b","001","002")@H_301_3@

j50b001003->("","003")@H_301_3@

j50->("","","")@H_301_3@

猜你在找的正则表达式相关文章