正则表达式
如何快速掌握正则表达式的基本使用???
学习正则表达式,非常好的网站:https://regex101.com/
背景
日常开发中正则无处不在,我们经常会使用到。比如按照一定的规则查找我 们需要的代码,就需要使用正则。然而正则比较复杂,不容易记住,掌握不好这个工具。
在工作中,要用到正则时,还得去查资料才能写出来,稍微复杂一点的正则,也很难短时间内搞定。
不难发现,学习和利用正则至关重要!!!
什么是正则呢?
正则是一个非常强大的文本处理工具,主要用来做三件事:
- 校验数据的有效性,比如用户输入的手机号,是不是符合规则;
- 从文本中提取需要的内容;
- 做文本内容替换;
怎么理解正则表达式?
简单来说,它就是描述字符串的规则。最简单的正则就是单个普通的字符。
正则表达式,组成:
- 元字符
- 贪婪和非贪婪
- 环视
- 子组
元字符
正则表达式是由元字符组成,元字符是正则表达式中有专用含义的字符。
如何记住元字符?分类记忆法。
分为五类:
- 基础
- 空白符
- 范围
- 边界
- 量词, 表示次数的量词
1. 基础
四类基础符:
- . 任意字符(换行除外)
- \d 任意数字 \D任意非数字
- \w 任意数字字母下划线 , \W 数字字母下划线以外的任意字符
- \s 任意空白符 \S 任意非空白符
2. 空白符
五类空白符:
- \r 回车符
- \n 换行符
- \f 换页符
- \t 制表符
- \v 垂直制表符
Windows 系统换行符: \r\n
linux 和 mac OS 换行符: \n
比较老的 mac OS换行符: \r
3. 量词
基础和空白符只能匹配单个字符,如果我们需要匹配单个字符重复多次,这就需要使用到表示次数的量词元字符
- *含义:0 到多次
- +含义:1到多次
- ?含义:0到1次, 如colou?r
- {m}含义:出现m次
- {m, n}含义:m到n次
- {,n}含义:其中m不写代表0,至多n次
- {m,}含义:其中n不写代表无穷大,至少m次
思考:
\d{11} 是什么意思?
4. 范围
管道符:
- | 或,如ab|bc 代表 ab 或 bc
- […] 多选一,括号中任意单个元素
- [a-z] 匹配a到z之间任意单个元素(按照ASCII表,包含a, z)
- [^…] 取反,不能是括号中的任意单个元素
思考:
匹配手机号:
1[3456789]\d{9}
1[3-9]\d{9}
1[^012]\d{9}
5. 边界
除了要找到满足匹配规则的字符外,还对匹配到的文本的位置有要求。
这就需要用到边界元字符:
- ^匹配行的开始
多行模式时,可以匹配任意行开头 - $ 匹配行的结束
多行模式时,可以匹配任意行的结尾 - \b 匹配单词的边界
- \A 仅匹配整个字符串的开始
不支持多行模式 - \Z 仅匹配整个字符串的结束
不支持多行模式
贪婪和非贪婪
1. 贪婪
表示次数的量词,默认是贪婪的,默认尽可能多地去匹配
2. 非贪婪
“数量”元字符后加?,找出长度最小且满足要求的
思考
目标字符串:
"the little boy" is a boy,
it look "a little bad".
正则表达式:
".+" 贪婪匹配
".+?" 非贪婪匹配
环视
如果我们对要查找字符的左右俩边有要求时,就需要使用到环视元字符:
- X(?<=Y) 匹配前面是Y的X
- X(?<!Y) 匹配前面不是Y的X
- X(?=Y) 匹配后面是Y的X
- X(?!Y) 匹配后面不是Y的X
简单来说,环视就是在我们给定的规则前或规则后,加一些限制
思考:
目标字符串:
<ul>
<li>item1</li>
<li>item2</li>
<li>item3</li>
<li>item4</li>
</ul>
正则表达式:
(?<=<li>)(.+)(?=</li>)
子组
将正则分成若干个小组
- (正则) 将regex保存成一个子组
- (?P正则) 命名子组,将regex保存成名称为name的子组
- (?:正则)仅分组,不保存这个子组
- \分组编号, 重复某个子组
思考:
目标字符串:
the cat cat is in the the hat.
正则表达式
(\w+) \1