正则表达式是一种处理字符串的微型语言;有以下的基本术语:
l 模式(pattern):正则表达式实际上是通过字符串表达的一个模式
l 匹配(match): 判断正则表达式和给出的序列[first , last),是否全部匹配
l 搜索(search):判断在给定的序列里是否存在和正则表达式匹配的子字符串
l 替换(replace):将匹配到的子字符串替换成其他的字符串
在C++里边默认的语法是ECMAScript,这是最强大的正则表达式的语法;
1. ECMAScript语法
1. 锚点(anchor)
特殊字符^和$是锚点,分别匹配到字符串的开头和结尾。例如:^text$,表达的意思就是只匹配text字符串
2.通配符(wildcard)
可以用来匹配除了换行符以外的任何字符,例如:正则表达式是:a.b,可以匹配到abc,adb,
但是不可是:acdb
3.替换
A|B 可以匹配到A或则是B
4.分组(捕获组)
例如:(.)(ab|cd)(.)其中有三个标记的子表达式,例如输入1ab5则可以捕获到,1 。 ab。5这仨个捕获组。
5.重复
* 表示匹配零次或则多次之前的部分。例如:a*b 可以匹配到b , ab , aab , aaab
+ 表示匹配一次以及一次以上之前的部分,例如:a+b可以匹配到ab , aab但是不能是b
? 表示匹配到零次或是一次以前的部分,例如: a ? b 可以匹配到ab , b 但是不能位 aab
{…}表示区间重复,a{n}表示匹配到的a刚好位n个,a{n,}表示匹配到的a为n位或则n位以上;a{n,m}表示匹配到的a的个数位>=n和<=m个;
6.贪婪匹配和非贪婪匹配
输入字符串位: aaabbb
贪婪匹配:正则表达式:(a+)(ab)*(b+) ,匹配到:”aaa””””bbb”
非贪婪匹配:正则表达式:(a+?)(ab)*(b+)匹配到:“aa“”ab””bb”;
7.优先级
第一:元素本身
第二:量词:+,* , ? {…}
第三:串联:例如ab+c在量词之后绑定
第四:替代符| ,最后绑定
例如:正则表达式:ab+c|d,会匹配到abc, abbc , d , 如果添加括号,ab+(c|d)则匹配到
, abc , abbc , abd abbd
8,字符集合匹配
[a-z]表示可以匹配到a到z之间的任意一个字符,(注意是任意一个,而不是多个)
[a-zA-Z]表示可以匹配到a到z以及A到Z之间对的任意一个字符;
另一种方法是使用某种字符类,表示方法[:name:]例如:
[[:digit:]]表示可以匹配到0~9之间的任意一个数字;
这里的name可以是以下:
Name |
Expression |
digit |
数字 |
d |
和digit一样 |
xdigit |
数字和表示16进制的abcdef或则ABCDEF |
alpha |
字母字符所有的大小写 |
alnum |
Alpha和digit的组合 |
w |
和alnum一样 |
lower |
小写字母 |
upper |
大写字母 |
blank |
一行文本中分割单词的空格符 |
punct |
标点符号字符,包括不是alnum意外的所有图形字符 |
应用:
问题:表示0~9的任意一个以及多个数字的匹配
解答:(1)[0-9]+
(2) [[:digit:]]+
(3) [[:d:]]+
(4) d+
问题:匹配除了小写字母以外的任意字符
解答:(1) [[:upper:]]
(2) [^[:lower:]]
9.后向引用
n是>0的整数,表示第n个捕捉组,例如:
正则表达式:([:d:]*)-.*-1
可以匹配到:123-abc-123 , 789-kdf-789 , 9-m-9
但是不可是:123-abc-1234,必须是123,和第一个捕获组一样的内容;
10.C++里的转义
转移d,在C++里应该将其转移,因为是特殊字符在C++里,所以需要转移,转义位:
\d.
转移\,这个更加麻烦。应该转译为:\\
例如:
正则表达式:( |\n|\r|\\)
搜索空格 , 换行符 , 回车符 , 反斜杠;