正则表达式是一种处理字符串的微型语言; 有以下的基本术语:
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 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|\\\\)
搜索空格 , 换行符 , 回车符 , 反斜杠;
正则表达式详解<一>
来源: http://www.bubuko.com/infodetail-2966017.html