Qt之正则表明式,Qt正则表明式小结

作者: 韦德国际1946国际网址  发布:2019-05-28

Qt里对盛名的正则表明式有很好的援救,使用QRegExp类,你能够丰硕快的造成对文本的证实、数据提取、替换。Qt的SDK包里还提供了regexp的GUI小工具,方便你对正则表达式的印证。

一. 常用正则表明式

表达式 说明
r, n 代表回车和换行符
t 制表符
\ 代表 "" 本身
^ 匹配 ^ 符号本身
$ 匹配 $ 符号本身
元字符 说明
. 匹配除了换行符以外的任意字符
w 匹配字母、数字、下划线、汉字
s 匹配任意的空白符
b 单词的开始或结尾
~ 匹配字符串的开始
$ 匹配字符串的结束

如:

baw*b :相配以字母a起头的单词——先是有些单词开头处(b),然后是字母a,然后是随机数量的假名或数字(w*),最终是单词甘休处(b)。

d :相称二个或越来越多三番五次的数字。这里的 是和*恍如的元字符,区别的是*合营重复猖狂次(也许是0次),而 则相称重复一次或更频仍。

bw{6}b: 相称刚大多少个字符的单词。

 

表达式 说明
[ ] 包含一系列字符
[^ ] 包含之外一系列字符
   

[ab5@]: 匹配 "a" 或 "b" 或 "5" 或 "@"

[^abc]: 包涵abc之外的随便字符

[f-k]: f-k之间的自由字符

表达式 说明
{n} 表达式重复n次,比如:"w{2}" 相当于 "ww""a{5}" 相当于 "aaaaa"
{m,n} 表达式至少重复m次,最多重复n次,比如:"ba{1,3}"可以匹配 "ba"或"baa"或"baaa
{m,} 表达式至少重复m次,比如:"wd{2,}"可以匹配 "a12","_456","M12344"...
? 匹配表达式0次或者1次,相当于 {0,1},比如:"a[cd]?"可以匹配 "a","ac","ad"
表达式至少出现1次,相当于 {1,},比如:"a b"可以匹配 "ab","aab","aaab"...
* 表达式不出现或出现任意次,相当于 {0,},比如:"^*b"可以匹配 "b","^^^b"...

sales1.xls
orders3.xls
sales2.xls
sales3.xls
apac1.xls
europe2.xls
na1.xls
na2.xls
sa1.xls
sam.xls
ca1.xls
cA1.xls
Ca1.xls
CA1.xls

正文在Qt4.五.3下验证通过。

贰.Qt 中选用正则表明式

    Qt 用QRegExp 来封装正则表明式。如: QRegExp rx("^[0-9] (\.\d )?$");

举个例子大家又那个三个有平整的字符串:价格:数量:商家编码:属性名:属性值;属性名:属性值; 价格:数量:厂家编码:属性名:属性值;属性名:属性值;属性名:属性值; 价格:数量:商家编码:属性名:属性值;

想要分成:

价格:数量:厂商编码:属性名:属性值;属性名:属性值; 
价钱:数量:厂商编码:属性名:属性值;属性名:属性值;属性名:属性值; 
价钱:数量:厂商编码:属性名:属性值;

率先选用适当的正则表达式:(w*:){3}(w*:Qt之正则表明式,Qt正则表明式小结。w*;) , 然后:

韦德国际1946国际网址 1

1 QRegExp rx(tr("(\w*:){3}(\w*:\w*;) ")); 
2 int pos(0);

4 while ((pos = rx.indexIn(str, pos)) != -1) 
5 { 
6 strList.push_back(rx.capturedTexts().at(0)); 
7 pos  = rx.matchedLength(); 
8 }

韦德国际1946国际网址 2

 

此间 strList 便是想要的结果了。

QRegExp

的更加多用法见Qt的文档。

 

3. 正则表明式规则

三.一 普通字符

    字母、数字、汉字、下划线、以及背后章节中没有特别定义的标点,都以"普通字符"。表达式中的普通字符,在合营一个字符串的时候,相配与之一样的2个字符。

     比如一:表明式 "c",在相配字符串 "abcde" 时,相称结果是:成功;相称到的剧情是:"c";相称到的职责是:起初于2,结束于三。(注:下标从0开头依旧从一上马,因日前编制程序语言的不等而大概两样)

     比方二:表明式 "bcd",在相称字符串 "abcde" 时,相称结果是:成功;相配到的内容是:"bcd";相配到的岗位是:开首于一,停止于4。

 

三.二 简单的转义字符

    一些辛苦书写的字符,采纳在前边加 "/" 的方法。这个字符其实大家都曾经熟习了。

表达式

可匹配

/r, /n

代表回车和换行符

/t

制表符

//

代表 "/" 本身

    还应该有别的部分在末端章节中有特别用途的标点,在前面加 "/" 后,就表示该符号本人。举个例子:^, $ 都有极度含义,假设要想相配字符串中 "^" 和 "$" 字符,则表明式就需求写成 "/^" 和 "/$"。

表达式

可匹配

/^

匹配 ^ 符号本身

/$

匹配 $ 符号本身

/.

匹配小数点(.)本身

    那么些转义字符的合营方法与 "普通字符" 是临近的。也是特别与之同样的一个字符。

     比释迦牟尼佛讲一:表达式 "/$d",在匹配字符串 "abc$de" 时,相配结果是:成功;相称到的剧情是:"$d";相称到的地点是:起始于3,停止于五。

 

3.三 能够与 '各类字符' 相称的表明式

    正则表明式中的一些表示方法,能够合营 '三种字符' 在那之中的任性三个字符。比如,表明式 "/d" 可以相称放肆一个数字。就算能够合营个中跋扈字符,不过只好是二个,不是多个。那就好比玩扑克时候,大小王能够代替放肆一张牌,不过只好代替一张牌。

表达式

可匹配

/d

任意一个数字,0~9 中的任意一个

/w

任意一个字母或数字或下划线,也就是 A~Z,a~z,0~9,_ 中任意一个

/s

包括空格、制表符、换页符等空白字符的其中任意一个

.

小数点可以匹配除了换行符(/n)以外的任意一个字符

    举例1:表达式 "/d/d",在匹配 "abc123" 时,相称的结果是:成功;相配到的内容是:"12";相称到的地方是:初步于三,甘休于五。

     举例2:表达式 "a./d",在匹配 "aaa100" 时,相称的结果是:成功;相称到的内容是:"aa壹";相配到的职务是:开头于一,结束于四。

 

三.四 自定义能够合营 '种种字符' 的表达式

    使用方括号 [ ] 包罗一多级字符,能够合营个中专断1个字符。用 [^ ] 包括一密密麻麻字符,则能够包容其中字符之外的人身自由四个字符。同样的道理,纵然能够包容当中专擅三个,不过只好是三个,不是多少个。

表达式

可匹配

[ab5@]

匹配 "a" 或 "b" 或 "5" 或 "@"

[^abc]

匹配 "a","b","c" 之外的任意一个字符

[f-k]

匹配 "f"~"k" 之间的任意一个字母

[^A-F0-3]

匹配 "A"~"F","0"~"3" 之外的任意一个字符

    举例1:表达式 "[bcd][bcd]" 匹配 "abc123" 时,相称的结果是:成功;相配到的原委是:"bc";相配到的任务是:初步于一,截至于三。

     [举例2:表达式 "[韦德国际1946国际网址,^abc]" 匹配 "abc123" 时](

 

三.五 修饰相配次数的特殊符号

    前边章节中讲到的表明式,无论是只可以合营1种字符的表明式,依旧得以包容四种字符在那之中专擅一个的表明式,都只能合作二遍。要是使用表明式再加上修饰相配次数的特殊符号,那么毫无再甲骨文写表明式就可以重复相称。

     使用方法是:"次数修饰"放在"被修饰的表明式"前边。譬喻:"[bcd][bcd]" 能够写成 "[bcd]{2}"。

表达式

作用

{n}

表达式重复n次,比如:"/w{2}" 相当于 "/w/w""a{5}" 相当于 "aaaaa"

{m,n}

表达式至少重复m次,最多重复n次,比如:"ba{1,3}"可以匹配 "ba"或"baa"或"baaa"

{m,}

表达式至少重复m次,比如:"/w/d{2,}"可以匹配 "a12","_456","M12344"...

?

匹配表达式0次或者1次,相当于 {0,1},比如:"a[cd]?"可以匹配 "a","ac","ad"

表达式至少出现1次,相当于 {1,},比如:"a b"可以匹配 "ab","aab","aaab"...

*

表达式不出现或出现任意次,相当于 {0,},比如:"/^*b"可以匹配 "b","^^^b"...

    举例1:表达式 "/d /.?/d*" 在匹配 "It costs $12.5" 时,相称的结果是:成功;相配到的剧情是:"1二.伍";相配到的岗位是:开始于拾,停止于1四。

     举例2:表达式 "go{2,8}gle" 在匹配 "Ads by goooooogle" 时,相配的结果是:成功;相称到的内容是:"goooooogle";相配到的职责是:开始于七,停止于一柒。

 

3.六 其余部分意味抽象意义的特殊符号

    一些标识在表明式中代表抽象的极其意义:

表达式

作用

^

与字符串开始的地方匹配,不匹配任何字符

$

与字符串结束的地方匹配,不匹配任何字符

/b

匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符

    进一步的文字表明照旧相比较抽象,由此,比如帮忙大家知道。

     举例1:表达式 "^aaa" 在匹配 "xxx aaa xxx" 时,相称结果是:退步。因为 "^" 供给与字符串开首的位置相配,由此,只有当 "aaa" 位于字符串的起来的时候,"^aaa" 技巧相配,比如:"aaa xxx xxx"。

     举例2:表达式 "aaa$" 在匹配 "xxx aaa xxx" 时,相称结果是:战败。因为 "$" 要求与字符串甘休的地方相配,因而,唯有当 "aaa" 位于字符串的结尾的时候,"aaa$" 手艺合作,比如:"xxx xxx aaa"。

     举例3:表达式 "./b." 在匹配 "@@@abc" 时,相配结果是:成功;相配到的从头到尾的经过是:"@a";匹配到的职务是:早先于二,截至于4。
     进一步求证:"/b" 与 "^" 和 "$" 类似,自身分裂盟任何字符,不过它要求它在特别结果中所处地方的左右两边,当中贰只是 "/w" 范围,另一头是 非"/w" 的限制。

     举例4:表达式 "/bend/b" 在匹配 "weekend,endfor,end" 时,相配结果是:成功;相称到的原委是:"end";匹配到的岗位是:初叶于一伍,甘休于1八。

    一些标记能够影响表明式内部的子表达式之间的关系:

表达式

作用

|

左右两边表达式之间 "或" 关系,匹配左边或者右边

( )

(1). 在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰
 (2). 取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到

    比喻五:表明式 "汤姆|杰克" 在相配字符串 "I'm 汤姆, he is 杰克" 时,相称结果是:成功;相配到的内容是:"汤姆";相称到的职位是:开端于四,停止于柒。相配下三个时,相配结果是:成功;相配到的内容是:"Jack";相配到的职责时:起头于一伍,甘休于1九。

     举例6:表达式 "(go/s*) " 在匹配 "Let's go go go!" 时 &txt=Let's go go go!),相配结果是:成功;匹配到内容是:"go go go";相称到的职位是:伊始于6,结束于1肆。

     举例7:表达式 "¥(/d /.?/d*)" 在匹配 "$10.9,¥20.5" 时&txt=%uFF0四十.玖,%uFFE520.5),相配的结果是:成功;匹配到的内容是:"¥20.5";相称到的职分是:开头于陆,停止于拾。单独获取括号限制相称到的原委是:"20.五"。

 

四. 正则表达式中的一些尖端规则

四.1 匹配次数中的贪婪与非贪婪

    在行使修饰相称次数的特殊符号时,有二种表示方法能够使同三个表明式能够包容不一样的次数,举例:"{m,n}", "{m,}", "?", "*", " ",具体同盟的次数随被相称的字符串而定。这种重新相配不定次数的表达式在合营进度中,总是尽也许多的相称。比方,针对文本 "dxxxdxxxd",比如如下:

表达式

匹配结果

(d)(/w )

"/w " 将匹配第一个 "d" 之后的所有字符 "xxxdxxxd"

(d)(/w )(d)

"/w " 将匹配第一个 "d" 和最后一个 "d" 之间的所有字符 "xxxdxxx"。虽然 "/w " 也能够匹配上最后一个 "d",但是为了使整个表达式匹配成功,"/w " 可以 "让出" 它本来能够匹配的最后一个 "d"

    综上可得,"/w " 在极其的时候,总是尽恐怕多的协作符合它规则的字符。纵然第3个举个例子中,它并未有相配最终二个"d",但那也是为着让任何表达式能够合作成功。同理,带 "*" 和 "{m,n}" 的表达式都以尽量地多相配,带 "?" 的表明式在可合作可不相配的时候,也是竭尽的 "要合营"。那 种匹配原则就叫作 "贪婪" 方式 。

    非贪婪方式:

     在修饰相配次数的特殊符号后再增进贰个 "?" 号,则足以使相配次数不定的表达式尽大概少的万分,使可卓殊可不匹配的表达式,尽或然的 "不相配"。这种相称原则叫作 "非贪婪" 方式,也叫作 "勉强" 形式。要是少相配就能够形成整个表达式相配失利的时候,与贪婪格局类似,非贪婪形式会最小限度的再合作一些,以使整个表明式相配成功。举个例子如下,针对文本 "dxxxdxxxd" 比如:

表达式

匹配结果

(d)(/w ?)

"/w ?" 将尽可能少的匹配第一个 "d" 之后的字符,结果是:"/w ?" 只匹配了一个 "x"

(d)(/w ?)(d)

为了让整个表达式匹配成功,"/w ?" 不得不匹配 "xxx" 才可以让后边的 "d" 匹配,从而使整个表达式匹配成功。因此,结果是:"/w ?" 匹配 "xxx"

    越来越多的情况,比方如下:

     举例1:表达式 "<td>(.*)</td>" 与字符串 "<td><p>aa</p></td> <td><p>bb</p></td>" 相称时bb

%三c/td%三e),相称的结果是:成功;匹配到的内容是 "<td><p>aa</p></td> <td><p>bb</p></td>" 整个字符串, 表达式中的 "</td>" 将与字符串中最后二个 "</td>"相称。

     比喻2:相比较之下,表明式 "<td>(.*?)</td>" 相配比如第11中学千篇1律的字符串时aa%叁ctd%叁e

 

四.二 反向引用 /1, /2...

    表明式在合营时,表明式引擎会将小括号 "( )" 包蕴的表达式所相配到的字符串记录下来。在取得相配结果的时候,小括号包蕴的表达式所相称到的字符串能够独立赢得。那一点,在前边的比方中,已经一而再出示 了。在实质上选取场馆中,当用某种边界来找出,而所要获取的开始和结果又不分包边界时,必须利用小括号来钦命所要的限定。比如前边的 "<td>(.*?)</td>"。

    其实,"小括号包涵的表明式所匹配到的字符串" 不仅仅是在特别甘休后才方可接纳,在合作进程中也能够使用。表达式前边的有些,能够引用前边 "括号内的子相配已经卓越到的字符串"。引用方法是 "/" 加上一个数字。"/壹" 引用第二对括号内相配到的字符串,"/2" 引用第一对括号内般配到的字符串……就那样推算,如若一对括号内富含另1对括号,则外层的括号先排序号。换句话说,哪1部分的左括号 "(" 在前,那那1对就先排序号。

    举个例子如下:

     举例1:表达式 "('|")(.*?)(/1)" 在匹配 " 'Hello', "World" " 时,相称结果是:成功;相配到的剧情是:" 'Hello' "。再次相称下一个时,能够相配到 " "World" "。

     举例2:表达式 "(/w)/1{4,}" 在匹配 "aa bbbb abcdefg ccccc 111121111 999999999" 时/一%柒b肆,%七d&txt=aa bbbb abcdefg ccccc%二零一二1121111 99999999玖),相称结果是:成功;相配到的内容是 "ccccc"。再一次相配下2个时,将获得 999999999。那一个表明式必要 "/w" 范围的字符至少重复七次,瞩目与 "/w{5,}" 之间的分别。

     举例3:表达式 "<(/w )/s*(/w (=('|").*?/4)?/s*)*>.*?<//1>" 在匹配 "<td id='td1' style="bgcolor:white"></td>" 时/s*(/w (=('%柒C),匹配结果是马到功成。要是 "<td>" 与 "</td>" 不配对,则会合营失利;假若改成其余配对,也得以协作成功。

 

四.三 预找出,不匹配;反向预搜索,不相称

    前边的章节中,笔者讲到了多少个代表抽象意义的特殊符号:"^","$","/b"。它们都有一个共同点,这正是:它们自己不匹配任何字符,只是对 "字符串的多头" 恐怕 "字符之间的缝隙" 附加了三个条件。精晓到这么些定义之后,本节将几次三番介绍其余1种对 "多头" 或许 "缝隙" 附加条件的,更加灵活的代表方法。

    正向预找寻:"(?=xxxxx)","(?!xxxxx)"

    格式:"(?=xxxxx)",在被相称的字符串中,它对所处的 "缝隙" 大概 "三头" 附加的尺度是:所在裂缝的左侧,必须可以包容上 xxxxx 那有个别的表达式。因为它只是在此看作那么些裂缝上附加的准绳,所以它并不影响后边的表明式去真正相称这些裂缝之后的字符。那就就如 "/b",本身不相称任何字符。"/b" 只是将所在裂缝以前、之后的字符取来拓展了一下论断,不会影响前面包车型客车表达式来实在的合作。

     举例1:表达式 "Windows (?=NT|XP)" 在匹配 "Windows 98, Windows NT, Windows 2000" 时&txt=Windows 玖八, Windows NT, Windows 三千),将只相称 "Windows NT"中的 "Windows ",其余的 "Windows " 字样则不被相称。

     比方二:表明式 "(/w)((?=/1/1/壹)(/1)) " 在相称字符串 "aaa ffffff 99999999九" 时((?=/1/1/一)(/壹)) &txt=aaa ffffff 99999999九),将能够合作伍个"f"的前陆个,能够包容七个"九"的前捌个。那几个表达式能够读解成:重复四次以上的字母数字,则相当其剩余最后肆个人以前的有个别。当然,这么些表明式能够不那样写,在此的目标是当做示范之用。

    格式:"(?!xxxxx)",所在缝隙的左边,必须不能够相配 xxxxx 那部分表明式。

     举例3:表达式 "((?!/bstop/b).) " 在匹配 "fdjka ljfdl stop fjdsla fdj" 时.) &txt=fdjka ljfdl stop fjdsla fdj),将起来从来特别到 "stop" 之前的职位,假设字符串中绝非 "stop",则格外整个字符串。

     举例4:表达式 "do(?!/w)" 在相称字符串 "done, do, dog" 时&txt=done, do, dog),只可以相称 "do"。在那一个比如中,"do" 后面使用 "(?!/w)" 和使用 "/b" 效果是一样的。

    反向预寻觅:"(?<=xxxxx)","(?<!xxxxx)"

    这两种格式的定义和正向预寻找是看似的,反向预寻觅供给的尺码是:所在裂缝的 "左边",三种格式分别须要必须能够包容和必须不可能协作钦赐表明式,而不是去决断左边。与 "正向预搜索" 同样的是:它们都以对所在裂缝的一种附加条件,本身都不包容任何字符。

     举个例子五:表明式 "(?<=/d{肆})/d (?=/d{4})" 在相称 "123456789012345陆" 时,将相配除了前伍个数字和后个数字之外的中档7个数字。由于 JScript.RegExp 不帮忙反向预搜索,因而,本条比方不可见实行出现说法。诸多任何的斯特林发动机可以援助反向预搜索,比方:Java 壹.肆 以上的 java.util.regex 包,.NET 中System.Text.RegularExpressions 命名空间,以及本站推荐的最简便易用的DEELX 正则引擎。

 

五. 别的通用规则

    还会有1部分在依次正则表达式引擎之间比较通用的规则,在前面包车型大巴教师进度中从未提到。

伍.一 表达式中,可以运用 "/xXX" 和 "/uXXXX" 表示二个字符("X" 表示2个十6进制数)

形式

字符范围

/xXX

编号在 0 ~ 255 范围的字符,比如:空格可以使用 "/x20" 表示

/uXXXX

任何字符可以使用 "/u" 再加上其编号的4位十六进制数表示,比如:"/u4E2D"

5.二 在表明式 "/s","/d","/w","/b" 表示特别意义的同不时候,对应的大写字母表示相反的意义

表达式

可匹配

/S

匹配所有非空白字符("/s" 可匹配各个空白字符)

/D

匹配所有的非数字字符

/W

匹配所有的字母、数字、下划线以外的字符

/B

匹配非单词边界,即左右两边都是 "/w" 范围或者左右两边都不是 "/w" 范围时的字符缝隙

5.三 在表明式中有异样意义,须求增多 "/" 技术相称该字符自己的字符汇总

字符

说明

^

匹配输入字符串的开始位置。要匹配 "^" 字符本身,请使用 "/^"

$

匹配输入字符串的结尾位置。要匹配 "$" 字符本身,请使用 "/$"

( )

标记一个子表达式的开始和结束位置。要匹配小括号,请使用 "/(" 和 "/)"

[ ]

用来自定义能够匹配 '多种字符' 的表达式。要匹配中括号,请使用 "/[" 和 "/]"

{ }

修饰匹配次数的符号。要匹配大括号,请使用 "/{" 和 "/}"

.

匹配除了换行符(/n)以外的任意一个字符。要匹配小数点本身,请使用 "/."

?

修饰匹配次数为 0 次或 1 次。要匹配 "?" 字符本身,请使用 "/?"

修饰匹配次数为至少 1 次。要匹配 " " 字符本身,请使用 "/ "

*

修饰匹配次数为 0 次或任意次。要匹配 "*" 字符本身,请使用 "/*"

|

左右两边表达式之间 "或" 关系。匹配 "|" 本身,请使用 "/|"

5.4 括号 "( )" 内的子表明式,假如期待相称结果不实行记录供未来选用,能够使用 "(?:xxxxx)" 格式

    举例1:表达式 "(?:(/w)/1) " 匹配 "a bbccdd efg" 时/一) &txt=a bbccdd efg),结果是 "bbccdd"。括号 "(?:)" 范围的相配结果不开始展览记录,因而 "(/w)" 使用 "/一" 来引用。

五.五 常用的表明式属性设置简要介绍:Ignorecase,Singleline,Multiline,Global

表达式属性

说明

Ignorecase

默认情况下,表达式中的字母是要区分大小写的。配置为 Ignorecase 可使匹配时不区分大小写。有的表达式引擎,把 "大小写" 概念延伸至 UNICODE 范围的大小写。

Singleline

默认情况下,小数点 "." 匹配除了换行符(/n)以外的字符。配置为 Singleline 可使小数点可匹配包括换行符在内的所有字符。

Multiline

默认情况下,表达式 "^" 和 "$" 只匹配字符串的开始 ① 和结尾 ④ 位置。如:

 ①xxxxxxxxx②/n
 ③xxxxxxxxx④

 配置为 Multiline 可以使 "^" 匹配 ① 外,还可以匹配换行符之后,下一行开始前 ③ 的位置,使 "$" 匹配 ④ 外,还可以匹配换行符之前,一行结束 ② 的位置。

Global

主要在将表达式用来替换时起作用,配置为 Global 表示替换所有的匹配。

相称非负整数(正整数  0)

^/d $

相配正整数

^[0-9]*[1-9][0-9]*$

相称非正整数(负整数  0)

^((-/d )|(0 ))$

相配负整数

^-[0-9]*[1-9][0-9]*$

相当整数

^-?/d $

相称非负浮点数(正浮点数  0)

^/d (/./d )?$

相当正浮点数

^(([0-9] /.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*/.[0-9] )|([0-9]*[1-9][0-9]*))$

相配非正浮点数(负浮点数  0)

^((-/d (/./d )?)|(0 (/.0 )?))$

相称负浮点数

^(-(([0-9] /.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*/.[0-9] )|([0-9]*[1-9][0-9]*)))$

合作浮点数

^(-?/d )(/./d )?$

相当由二6个英文字母组成的字符串

^[A-Za-z] $

格外由2几个英文字母的大写组成的字符串

^[A-Z] $

10分由2五个英文字母的小写组成的字符串

^[a-z] $

格外由数字和2陆个英文字母组成的字符串

^[A-Za-z0-9] $

合营由数字、二多个英文字母或许下划线组成的字符串

^/w $

匹配email地址

^[/w-] (/.[/w-] )*@[/w-] (/.[/w-] ) $

匹配url

^[a-zA-z] ://匹配(/w (-/w )*)(/.(/w (-/w )*))*(/?/S*)?$

匹配html tag

</s*(/S )(/s[^>]*)?>(.*?)</s*///1/s*>

 

假诺要需要用户的输入只好是数字,英文大小写字母,下划线,汉字,则可以用上边的秘技

QRegExp regExp; 
regExp.setPattern("^[a-zA-Z0-9_u4e00-u9fa5\w] $");

\w不要忘了啊~~

***********************************************
正则表明式:
.a..xls
结果:
na1.xls
na2.xls
sa1.xls
ca1.xls
Ca1.xls

用正则表明式验证文本有效性

您能够利用QRegExp::exactMatch来推断叁个字符串是还是不是符合四个pattern。

void testRegexMatch()
{
    QString pattern(".*=.*");
    QRegExp rx(pattern);

    bool match = rx.exactMatch("a=3");
    qDebug() << match;                      // True

    match = rx.exactMatch("a/2");
    qDebug() << match;                      // False
}

***********************************************
正则表明式:
.a.
结果:
sal
sal
sal

用正则表明式提取数额

您能够应用利用正则表达式从三个字符串里提取一定的字段或数量。比如,你能够用来下代码从"a=拾0"里提取"a"和"十0"。

void testRegexCapture()
{
    QString pattern("(.*)=(.*)");
    QRegExp rx(pattern);

    QString str("a=100");
    int pos = str.indexOf(rx);              // 0, position of the first match.
                                            // Returns -1 if str is not found.
                                            // You can also use rx.indexIn(str);
    qDebug() << pos;
    if ( pos >= 0 )
    {
        qDebug() << rx.matchedLength();     // 5, length of the last matched string
                                            // or -1 if there was no match
        qDebug() << rx.capturedTexts();     // QStringList("a=100", "a", "100"),
                                            //   0: text matching pattern
                                            //   1: text captured by the 1st ()
                                            //   2: text captured by the 2nd ()

        qDebug() << rx.cap(0);              // a=100, text matching pattern
        qDebug() << rx.cap(1);              // a, text captured by the nth ()
        qDebug() << rx.cap(2);              // 100,

        qDebug() << rx.pos(0);              // 0, position of the nth captured text
        qDebug() << rx.pos(1);              // 0
        qDebug() << rx.pos(2);              // 2
    }
}

ap
na1
na2
sa1
ca1
Ca1

用正则表明式修改文件

你能够把字符串中杰出的字符串替换到"一般字符串"

    QString s = "a=100";
    s.replace(QRegExp("(.*)="), "b=");
    qDebug() << s;                          // b=100

想必把字符串中相配的字符串替换"提取的字符串"

    QString s = "a=100";
    s.replace(QRegExp("(.*)=(.*)"), "\1\2=\2");  // 1 is rx.cap(1), 2 is rx.cap(2)
    qDebug() << s;                                  // a100=100

***********************************************
正则表达式:
sales.
结果:
sales1
sales2
sales3

把正则表明式调换到C/C string的小工具

没有Python的"""或是C#的@。标准的正则表明式因为出现一些特殊字符,在C/C 代码里应用时,必须实行转移。举个例子:"(S )s*=s*(S*)"必须转变到"(\S )\s*=\s*(\S*)"

Qt的SDK里含有1个很帮的GUI工具,能够一本万利咱们实行那类转变并测试你的表明式。在Linux下,它的路径是/usr/local/Trolltech/Qt-四.5.3/examples/tools/regexp/regexp


***********************************************
正则表明式:
.a
结果:
sa
sa
sa

a
pa
na
na
sa
ca
Ca

***********************************************
正则表明式:
[ns]a..xls
结果:
na1.xls
na2.xls
sa1.xls

本文由韦德国际1946发布于韦德国际1946国际网址,转载请注明出处:Qt之正则表明式,Qt正则表明式小结

关键词: 正则表达式 韦德官网登陆