正则表达式必知必会
读完了正则表达式必知必会( Regular Expressions in 10 Minutes )后写的一篇笔记,基本是按照书的架构总结的重点。但只是把这本书看过一遍并没有什么用,正则表达式还是要多实践才能比较好地掌握。
入门
作用:匹配 & 处理文本
区分大小写
匹配文本
基本字符:
- . 字符:匹配任何一个单个的字符
- \ 字符:转义字符
-
- 字符:在 [ ] 中定义字符区间
- [] 字符:[ 和 ] 字符,定义一个字符集合
eg: [0-9], [a-z] ,[A-Z], [A-z]([A-z] 少用,因为A-z包括ASCII表里夹在A到z之间的所有字符)
- ^ 字符:取非字符,紧跟在 [ ] 字符中的 [ 后面,作用于给定字符集合里所有的字符或者字符区间
元字符:
空白元字符 | 说明 |
---|---|
[\b] | 回退(并删除)一个字符( Backspace 键) |
\f | 换页符 |
\n | 换行符 |
\r | 回车符 |
\t | 制表符( Tab 键) |
\v | 垂直制表符 |
数字元字符 | 说明 |
---|---|
\d | 任何一个数字字符(等价于[0-9]) |
\D | 任何一个非数字字符(等价于[^0-9]) |
字母数字元字符 | 说明 |
---|---|
\w | 任何一个字母数字字符(大小写均可)或下划线字符(等价于[a-zA-Z0-9_]) |
\W | 任何一个非字母数字字符或下划线字符(等价于[^a-zA-Z0-9_]) |
空白字符元字符 | 说明 |
---|---|
\s | 任何一个空白字符(等价于[\f\n\r\t\v]) |
\S | 任何一个非空白字符(等价于[^\f\n\r\t\v]) |
重复匹配
-
- 匹配一个或多个字符
-
- 匹配零个或多个字符
- ? 匹配零个或一个字符
- {次数} 匹配任意次数的值
{n,m} 匹配区间,至少 n 次,至多 m 次,若省略则为∞
*
贪婪型匹配 | 懒惰型匹配 |
---|---|
最大长度匹配 | 非最大长度匹配 |
* | *? |
+ | +? |
{n,} | {n,}? |
位置匹配
- \b 匹配一个位于【一个能够用来构成单词的字符(字母、数字和下划线,也就是与 \w 相匹配的字符)】和【一个不能用来构成单词的字符(也就是与 \W 相匹配的字符)】之间的位置,即单词边界
- \B 匹配非单词边界
- ^ 定义字符串开头
eg:^\s*?<\?xml.*\?> 这个正则表达式将匹配字符串开头处的
子表达式
用(和)括号括起来的表达式,称为子表达式,视为一个独立元素。- (子表达式){1,4} 子表达式的多次连续重复查找
- 避免歧义。如查找一个四位年份 19|20\d{2} 会导致查找 19 或 20xx 这两种类型的数据,正则表达式应该改为 (19|20)\d{2}
- 子表达式的嵌套。
回溯引用
回溯引用指的是模式的后半部分引用在前半部分中定义的子表达式,像引用变量一样调用,在后半部分和前半部分之间建立了关联。
格式:\1 反斜杠加数字,数字代表模式中要引用子表达式的排序
如 ([1-6]).*?\1 这里的 \1 指的就是第一个子表达式即 [1-6] 匹配到的值
应用:对文本进行格式修改(通过查找表达式和替换表达式中 \ 和 $ 的对应回溯引用实现)
元字符 | 说明 |
---|---|
\E | 结束 \L 或 \U 转换 |
\l | 把下一个字符转换为小写 |
\L | 把 \L 到 \E 之间的字符全部转换为小写 |
\u | 把下一个字符转换为大写 |
\U | 把 \U 到 \E 之间的字符全部转换为大写 |
前后查找
向前查找(lookahead) & 向后查找(lookbehind)
指定一个必须匹配但不在结果中返回的模式
向前查找 (?=)
向后查找 (?<=)
均需要用子表达式与其他内容分隔开
负向前查找 (?!)
负向后查找 (?