现在的位置: 首页 > 综合 > 正文

qt 正则表达式

2013年09月05日 ⁄ 综合 ⁄ 共 4456字 ⁄ 字号 评论关闭

今天细看了一下正则表达式,记录之

正则表达式类

QRegExp类使用正则表达式提供了模式匹配

一正则表达式(regexp)用来在文中的子串中进行模式匹配,在很多环境下都经常用到,例如:

1、validation 检验数据有效性,正则表达式可以用来检验字串是否符合某个规则,比如是一个整形或者不包含空格

2、查找 正则表达式与简单的字串比较相比提供了更强大的模式匹配,比如:匹配mail、letter、或者correspondence中的任意一个,但不是email、mailman、mailer和letterbox中的任何一个等等

3、查找替换 正则表达式可以使用不同的字串来替换与正则表达式匹配的字串,比如使用&amp替换所有的&,但&后边已经紧跟amp的除外

4、字符串分割 正则表达式可以用来标识字符串的分割点,比如将字符串以tab分割。

 

这里只是简单的介绍,至于qt中正则语言的详细描述,实例和函数等参见文档本身。

QRegExp是基于Perl 正则表达式语言的,它完全支持Unicode,它同样可以像shells命令中的函数样使用,在QregExp中的语法规则可以使用setPatternSyntax()函数修改,尤其是,匹配语法可以设置为QregExp::FixedString,意思是要匹配的模式以简单的字符串看待,这样,特殊字符(比如:/反斜杠)都不会逃掉。

一本好的关于正则表达式的书<Mastering Regular Expressions>(第三版) 作者 Jeffrey E.F.Friedl .ISBN 0-596-52812-4

 

介绍:

       正则表达式是由表达式,量词和声明断言构成,最简单的表达式是一个字符,如:x或5,一个表达式也可以是由中括号包含起来的字符集,[ABCD]将匹配A、B、C、D其中任意一个,同样我们也可以写成[A-D],要匹配所有的大写英文字符就可以使用表达式[A-Z].

 

量词制订了表达式必须匹配的次数,x{1,1}匹配一个并且仅仅是一个x,x{1,5}匹配一组连续的x字符,最多不超过5个(可以是,x,xx,xxx,xxxx,xxxxx)

 

注意,一般的表达式不能用来检查括号或者标签的相对应字符,例如,如果<b>没有被嵌套,正则表达式可以匹配开放的<b>标签html<b>和其关闭</b> ,反之如果<b>被嵌套了,那么同样的正则表达式将会匹配错误的关闭</b>,

比如html片段:  <b>bold<b>bolder</b></b>

第一个<b>会匹配第一个</b>,这是错误的,如果嵌套层次固定且可知时可以写出括号或标签正确匹配的正则表达式,否则不能。

 

假如你想写一个匹配0-99整数的正则表达式,,至少需要一个数字,故你写表达式[0-9]{1,1},该表达式匹配一个数字,匹配范围为0-9,要匹配到99,将最大发生次数提高到2,所以正则表达式变为[0-9]{1,2},该表达式满足开始的0-99整数的需求,但同样也匹配其再子字符串中间的案例,如果想将整数视为一个完成字符串来匹配,就必须使用固定声明^和$,当^作为正则表达式的第一个字符时,意味着匹配字符必须是字符串的开始,同理当$为一个正则表达式的最后一个字符时,意味着正则表达式必须匹配到字符串的结尾(即完整字符串匹配),

 

此时正则表达式变成了^[0-99]{1,2}$,注意^和$在表达式中但不匹配字符。

如果你在别处看过关于正则表达式的,可能与现在这里所说的不太一样,这是因为字符集合和一些量词太常见了,故用其它特殊 符号来表示[0-9]可以使用\d代替,量词只匹配一次{1,1}可以使用其本身代替(即可以省略不写),x{1,1}和x是一样的,所以0-99就可以写成^\d{1,2}$

,还可以写成^\d\d{0,1}$,例如以数字开头的字符串,后边紧跟0或者一个数字的字符串,在实际中通常可以写成^\d\d?$, 其中?是{0,1}的简写方式,即发生0次或1次,?使得一个表达式可选,正则表达式^\d\d?$意味着从字符串开头开始,匹配一个数字,紧接着是0或1个数字,然后就是字符串结尾。

 

要写一个匹配”mail”,”letter”,”correspondence”其中之一但不匹配包含前面三个词的字符串,比如”email”,”mailman”,”mailer”,和”letterbox”,正则表达式,首先,要匹配”mail”,完整的表达式是m{1,1}a{1,1}i{1,1}l{1,1},因为单个字符自动匹配{1,1}所以,简单表达式为mail,即为m后紧跟a,a后紧跟i,i后紧跟l,

使用|表示或,故表达式mail|letter|correspondence 意味着匹配mail或letter或correspondence,

同样email也会匹配,为阻止匹配不想要的词,我们必须告之匹配一个单词边界 的开始与结尾,首先使用括号将其括起来(mail|letter|correspondence).表示正则表达式的一部分,在复杂的正则吧表达式中这样可以更明了其构成,这样也可以告诉我们是哪个词被匹配了,强制匹配一个词的开始与结尾,使用\b,表达式变为\b(mail|letter|correspondence)\b,现在表达式的意思就是:匹配单词边界,紧接着是圆括号内的表达式,然后是单词边界,\b声明一个位置匹配,不是字符,单词边界为任何非-单词字符,比如,空格,新行(换行)或字符串的开始和结尾。

 

如果想使用html中的&amp;来替换普通的&,正则表达式匹配单个的&,但是,表达式同样也匹配已经使用html替换的&amp;中的’&’,我们只是想匹配那些’&’后紧跟的不是amp;的’&’

就需要使用否定断言,(?!__),该表达式可以写成&(?!amp;)

 

如果想计数’Eric’和’Eirik’在字符串中的个数,两个方法可行,\b(Eric|Eirik)\b和\bEi?ri[ck]\b

 

 

稍后将实现上述中的一些实例。

 

字符集中的字符和缩写

对象                                   意义

C                                        单个字符标识其本身,除非它在正则表达式中有特殊意义

\c                                        特殊字符本身,

\a                                        匹配ASCII bell(BEL,0x07)

\f                                        匹配ASCII form feed(FF,0x0C)

\n                                       匹配ASCII 行(LF,0x0A,Unix newline)

\r                                        匹配ASCII 回车(CR,0x0D)

\t                                        匹配ASCII  水平tab键(HT,0x09)

\v                                       匹配ASCII 竖直tab键(VT,0x0B)

\xhhhh                                匹配Unicode字符十六进制数hhhh(0x0000 -0xFFFF)

\0ooo                                  匹配八进制数ooo(0-0377)

.                                         匹配任意字符(包括newline)

\d                                       匹配数字(Qchar::isDiagit())

\D                                       匹配非数字

\s                                        匹配空格字符(Qchar::isSpace())

\S                                       匹配非空格字符

\w                                       匹配单词字符(Qchar::isLetterOrNumber(),Qchar::isMark(),或者’_’)

\W                                      匹配非单词字符

\n                                       匹配第几个backreference 例如\1,\2

 

C++编译器转义反斜杠,在正则表达式中包含\,需要写成\\,若要匹配反斜杠字符本身,键入四次\\\\.

 

 

字符集

中括号字符集表示匹配其中的任意一个字符,

1、[abc]表示其中的任意一个,[^abc]表示除a,b,c外任意一个字符

2、[W-Z]表示 ‘W’,’X’,’Y’,’Z’中任意一个字符

 

 

量词

1、E?            表示0个或一个E,  ?表示前面是一个可选项,等价于E{0,1}

2、E+            表示至少一个E,E+等价于E{1,}

3、E*            表示0个或者多个E,相当于E{0,}

4、E{n}        表示n个E

5、E{n,}              表示至少n个E

6、E{,m}      表示最多m个E

7、E{n,m}     表示E的个数在n和m之间

 

Tag+ 表示至少一个g,(Tag)+表示至少一个Tag

 

圆括号可以让我们将元素组织到一起,以便确定数量和捕获他们,例如,我们有正则表达式mail|letter|correspondence  匹配一个字符串,我们直到其中一个被匹配了,但不知道是哪一个,使用圆括号就可以,使用(mail|letter|correspondence)匹配字符串”I sent you some email” ,我们可以使用cap()或者capturedText()函数获取匹配字符串,这里是”mail”:

 

在正则表达式本身就可以使用捕获字符串,以索引1开始使用反引用文本,同cap()函数一样,例如,在字符串中的重复单词使用正则表达式\b(\w+)\W+\1\b

意味着匹配一个单词边界,紧跟一个或多个单词字符,紧跟一个或多个非单词字符,然后是(前面中括号中的)一个或多个单词字符

 

如果我们使用圆括号仅仅时分类归组而不是捕获,我们可以使用非捕获语法格式,比如(?:green|blue),在这个例子中我们匹配green或者blue,但是我们没有捕获匹配项,所以我们只直到是否有颜色匹配,但不知道具体匹配的是哪个颜色。

当然非捕获模式比捕获模式效率要高。

 

【上篇】
【下篇】

抱歉!评论已关闭.