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]|-|\\.|\\+)*
|