正则真是个神奇的东西,每次学习都有新的感觉,但却一直都不太会……
什么是正则
非常强大的文本处理工具
- 校验数据的有效性
- 从文本中提取内容
- 文本内容的替换
元字符
基础的元字符:正则表达式中具有特殊含义的那些专用的字符
元字符分类
- 基础
·表示换行以外的任意字符\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,比如
- 用
.可以匹配所有字符,包括换行 - 多行的匹配模式
- 大小写不敏感的匹配模式
- ……
资源
推荐书籍:精通正则表达式(第三版)