C++中正则表达式浅析

C++11标准开始支持正则表达式,语法包括ECMAScript、basic、extended、awk、grep和egrep,其中ECMAScript是默认的语法,下面简要介绍一下。

模式匹配

字符 可匹配
d 数字0~9
D 除了数字0~9
w a-z,A-Z,0-9,_之一
W w取反
s 空白字符(空格,制表符等)
S s取反
r 回车
n 换行
. 除了行结束符外所有字符

字符匹配

字符 可匹配
[abc]或[a-c] 匹配’a’或’b’或’c’
[^abc] 匹配’a’,’b’,’c’之外的字符
[[:alnum:]] 匹配所有字母和数字
[[:digit:]] 匹配0-9数字
[[:d:]] 同上

数量

字符 可匹配
* 0个或多个
+ 1个或多个
? 0个或1个
{n} n个
{n,} 大于等于n个
{m,n} m~n个

用法为子模式后面接上述字符,比如([0-9])*可以匹配任意位数的数字(包括空字符串),而([0-9])+则至少有1位,(0-9){3}表示3为整数。

位置

字符 表示
^ 行开始
$ 行结束
b 字符边界
B 非字符边界

有关ECMAScript更详细的信息,可以参考ECMAScript.下面讲两个实际的例子。

1.手机号码匹配

13[0-9]{9}

2.absolute URI

根据RFC3986, absolute URI如下定义

1
absolute-URI  = scheme ":" hier-part [ "?" query ]

为了简单起见,我们这里只判断scheme,后面的大家感兴趣可以一步一步做下去作为练习。scheme的命名规范如下:

1
scheme      = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )

简单思考之后,可以写出如下正则表达式

1
([a-zA-Z])([a-zA-Z0-9]|-|\\.|\\+)*