正则真是个神奇的东西,每次学习都有新的感觉,但却一直都不太会……
什么是正则
非常强大的文本处理工具
- 校验数据的有效性
- 从文本中提取内容
- 文本内容的替换
元字符
基础的元字符:正则表达式中具有特殊含义的那些专用的字符
元字符分类
- 基础
·
表示换行以外的任意字符\d
任意数字,\D
任意非数字\w
任意数字字母下划线\W
数字字母下划线以外的任意字符\s
任意空白符\S
任意非空白符
- 空白符
\r
回车符\n
换行符\f
换页符\t
制表符\v
垂直制表符
- 范围
|
管道符号,表示满足其中任意一个即可[...]
多选一,括号中任意单个元素[a-z]
匹配 a-z 之间任意单个元素,按照 ASCII 表[^...]
取反,不能是括号中的任意单个元素
- 边界
^
匹配行的开始,多行模式时,可以匹配任意行开头$
匹配行的结束,多行模式时,可以匹配任意行结尾\b
匹配单词边界\A
仅匹配整个字符串的开始,不支持多行模式\Z
仅匹配整个字符串的结束,不支持多行模式
- 量词
*
表示 0 到多次+
表示 1 到多次?
表示 0 到 1 次{m}
出现 m 次{m, n}
出现 m 到 n 次{, n}
m 不写不是 0,至多 n 次{m, n}
n 不写表示无穷大,至少 m 次
贪婪与非贪婪
正则表达式中,表示次数的量词,默认是贪心的,尽可能多的去匹配符合要求的内容
- 默认时贪婪的
- 非贪婪:数量的元字符后加
?
(英文问号),找出长度最小且满足要求的
环视
当我们想要对提取字符串的左边或者右边的环境有要求的时候,比如查找左边是数字的字母
环视就是对于我们给定的规则前或规则后加一些限制
(?<=Y)X
匹配前面是 Y 的 X(?<!Y)X
匹配前面不是 Y 的 XX(?=Y)
匹配后面是 Y 的 XX(?!Y)
匹配后面不是 Y 的 X
子组
子组:将正则分成若干个小组
(正则)
将 regex 保存成一个子组(?P<name>正则)
命名子组,将 regex 保存成名词为 name 的子组(?:正则)
仅分组,不保存这个子组\分组编号
重复某个子组,从 1 开始编号
子组功能
- 某个部分的内容在后面重复出现
- 对某个部分的内容进行替换
flag
正则匹配的时候可以指定 flag,比如
- 用
.
可以匹配所有字符,包括换行 - 多行的匹配模式
- 大小写不敏感的匹配模式
- ……
资源
推荐书籍:精通正则表达式(第三版)