正则表达式即一个文本匹配字符串的一种模式,Qt中使用QRegExp类进行模式匹配.主要应用:字符串验证,搜索,替换,分割.....
正则表达式中字符及字符集
c |
匹配字符本身,如a匹配a |
\c |
跟在\后面的字符匹配字符本身,但本表中下面指定的这些字符除外。 |
\a |
匹配ASCII的振铃 |
\f |
匹配ASCII的换页 |
\n |
匹配ASCII的换行 |
\r |
匹配ASCII的回车 |
\t |
匹配ASCII的水平制表符 |
\v |
匹配ASCII的垂直制表符 |
\xhhhh |
匹配Unicode字符对应的十六进制数 |
\0ooo |
匹配八进制的ASCII/Latin1字符 |
. |
匹配任意字符 |
\d |
匹配任意一个数字 |
\D |
匹配一个非数字 |
\s |
匹配一个空白字符,包括“\t”、“\n”、“\v”、“\f”、“\r”及“” |
\S |
匹配一个非空白字符 |
\w |
匹配一个单词字符,包括任意字符数字下划线,即A~Z,a~z,0~9中任意一个 |
\W |
匹配一个非单词字符 |
\n |
第n个反向引用 |
正则表达式中的量词
E? |
匹配0次或1次等价于E{0,1} |
E+ |
匹配1次或多次,等价于E{1,} |
E* |
匹配0次或多次,等价于E{0,} |
E{n} |
匹配n次 |
E{n,} |
匹配至少n次 |
E{,m} |
匹配至多m次 |
E{n,m} |
匹配至少n次,至多m次 |
正则表达式中的断言
^ |
标志字符串的开始。若匹配“^”则使用“\\^” |
$ |
标志字符串的结尾。若匹配“$”则使用“\\$” |
\b |
一个单词的边界 |
\B |
一个非单词的边界。当\b为false则它为true |
以上是在正则表达式中字符的使用解释,这不必要求能记下来,知道正确使用,在用到的时候能查阅使用就可以了.
一.QRegExp
1.
exactMatch()精准匹配字符,匹配的字符完全相同时返回true,否则返回false.
QRegExp reg("a");
qDebug()<<"匹配字符本身:"<
2.
exactMatch()精准匹配字符,数字.
通过上面的表格,我们可知: \d表示匹配任意一个数字,我们需要再加一个\进行转义.*表示匹配0次或多次.\D表示匹配一个非数字,{2}表示匹配2次.
QRegExp reg0("(\\d*\\D{2})");//()仅仅作为字符串组合.D{2}匹配2个字符.\\d*匹配任意个数字
qDebug()<<"匹配数字:"<
3.
匹配通配符.
*表示匹配0次或多次.使用setPatternSyntax()设置匹配语法,正则表达式支持通配符.它的参数有好几个枚举值,其中QRegExp::wildcard 正则表达式支持通配符;QRegExp::RegExp 正则表达式支持默认语法.
QRegExp rx("*.txt");
//设置匹配语法
rx.setPatternSyntax(QRegExp::Wildcard);//正则表达式支持通配符
//rx.setPatternSyntax(QRegExp::RegExp);//正则表达式支持默认语法
qDebug()<<"通配符匹配:"
<
4.
断言,匹配单词边界.
\b表示一个单词的边界. \\b(hello|Hello)\\b 表示单词hello|Hello前后都有一个其他的字符,这是单词的边界.使用indexIn()函数匹配字符,可以返回匹配到的字符的位置,-1表示匹配失败.返回的正整数表示匹配到的字符具体位置.
QRegExp reg1;
//设置匹配模式
// \b代表一个单词的边界, \\b(hello|Hello)\\b 表示单词前后都有一个其他的字符
reg1.setPattern("\\b(hello|Hello)\\b");
qDebug()<<"匹配多个单词:"<
5.
捕获匹配的文本.cap()函数捕获的文本不会捕获到空格.cap(0)捕获全部匹配的文本.cap(1)捕获匹配到的第一个文本.cap(2)捕获匹配到的第二个文本.下面代码,正因为cap()不会捕获到空格,所以匹配到的文本226 cm中,cap(1)捕获到226;cap(2)捕获到的是cm而不是空格.
\d表示匹配任意一个数字.+表示匹配1次或多次.
(?:表示开始.
\s表示匹配一个空白字符,包括制表符“\t”、换行符“\n”、垂直制表符“\v”、换页符“\f”、回车符“\r”及“”.
*表示匹配0次或多次.
)表示结束.
QRegExp regHeight("(\\d+)(?:\\s*)(cm|inch)");//英尺
//匹配文本
int res = regHeight.indexIn(" YaoMing 226 cm");//文本匹配
if(res>-1){
qDebug()<<"文本捕获:"<<"cap(0):"<
6.
断言 ?!不紧跟才匹配.replace()替换字符.indexIn()找出匹配的字符位置.
QRegExp reg2;
//QRegExp reg2("面(?!包)");//可在定义时直接设置 reg2("面(?!包)"),也可通过setPattern()设置
//设置匹配模式.
reg2.setPattern("面(?!包)");//"面"后不紧跟"包"才匹配,即面和包不能在一起
QString str = "面没了,吃面包也好,吃面食物也可以.";
qDebug()<
二.QRegularExpression
在Qt 5中引入了新的正则表达式类QRegularExpression.
1.
match()部分匹配,并返回匹配到的字符位置.匹配到的字符起始位置:0-5,字符为"hello"
QRegularExpression regExp("hello");
//部分匹配,匹配一段字符结果 match().匹配到的字符起始位置:0-5,字符为"hello"
qDebug()<<"QRegularExpression 匹配字符:"<
2.大小写不敏感匹配.
\w表示匹配一个单词字符,包括任意字符数字下划线,即A~Z,a~z,0~9中任意一个.{3,8}表示最少匹配3次,最多匹配8次.A-Z表示可匹配范围大写字母A到Z.
setPatternOption()匹配模式选项,它有非常多的匹配模式枚举值,其中常用的有:
QRegularExpression::CaseInsensitiveOption表示大小写不敏感匹配;
QRegularExpression::NoPatternOption表示不设置匹配模式,就是默认匹配模式.
QRegularExpression::DotMatchesEverythingOption表示正则表达式中的.
可以匹配任何字符,包括换行符。如果不使用该选项,则.
只能匹配除了换行符以外的任何字符.
QRegularExpression::MultilineOption用于指定正则表达式是否跨行匹配。如果启用了此选项,则^和$元字符将匹配每行的开头和结尾,而不是整个字符串的开头和结尾.
......
//regExp.setPattern("[\\w]{3,8}"); //设置匹配模式.匹配3到8个字符
regExp.setPattern("[A-Z]{3,8}"); //设置匹配模式
regExp.setPatternOptions(QRegularExpression::CaseInsensitiveOption);//设置模式选项.大小写不敏感(不区分大小写)
qDebug()<<"大小写不敏感匹配:"<
3.captured()捕获文本.
captured(0)完整捕获整个文本;captured(1)捕获第一个文本;以此类推.hasMatch()精准匹配.如果匹配成功则返回true.
QRegularExpression reDate("^(\\d\\d)/(\\d\\d)/(\\d\\d\\d\\d)$");//日/月/年
QRegularExpressionMatch match0 = reDate.match("01/10/1949");//匹配类
if(match0.hasMatch()){//hasMatch()如果成功返回true
QString strMatch = match0.captured(0); //完整匹配,捕获整个文本
QString day = match0.captured(1); //捕捉到第一个文本日
QString month = match0.captured(2); //捕捉到第二个文本到月
QString year = match0.captured(3); //捕捉到第三个文本到年
qDebug()<<"捕获文本:"<<"strMatch:"<
4.部分匹配match().^表示字符串匹配开始,$表示字符串匹配结束.
hasMatch()精准匹配.hasPartialMatch()部分匹配.
//部分匹配
QString sPattern;
sPattern = "^(Jan|Feb|Mar|Apr|May) \\d\\d \\d\\d\\d\\d$";//月 日 年
QRegularExpression reDate1(sPattern);//初始化指定表达式
QString ss("Apr 01");//不完整
QRegularExpressionMatch match1;//用于接收匹配结果
//reDate1.match().调用match()方法,返回的是QRegularExpressionMatch类型,所以用该类型接收
match1 = reDate1.match(ss, //需匹配的字符
0, //匹配开始的位置
QRegularExpression::PartialPreferCompleteMatch//匹配模式:部分匹配
);
bool bHasMatch = match1.hasMatch(); //精准匹配
bool bPartial = match1.hasPartialMatch(); //部分匹配
qDebug()<
关于Qt正则表达式的分享就到这里了,all~~