1. 前言
- 以前每次需要正则的时候总是去control+c&v,后来有次遇到大牛写逻辑业务的时候直接用正则处理一些判断,觉得:嗯!很cool,需要去了解下!!
- 看完之后,基本语法了解了之后还是要多用,多尝试,才能把这个技能写的越来越溜,才能把这个逼装好
2. 准备
- 首先先怎么要看几篇文章吧,主要看了小松哥的文章和语法介绍
- 工具:Regextor:可以校验你写的的正则表达式的正确性的APP,APPStore上6元,当然有时间可以自己找找破解版
Regextor.png - 正则表达式就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,用来表达对字符串的一种过滤逻辑,画下重点:
规则字符串+过滤匹配
3. 字符&字符集的匹配
3.1 精确匹配某一个字符
- 使用
[]
包裹的字符即是需要特殊匹配的字符 -
默认是会区分大小写
精确某一个字符.png
3.2 匹配任意字符
-
使用
.
来表示一个任意字符, 使用..
来表示两个任意字符,以此类
推
匹配一个任意字符.png
匹配两个任意字符.png -
解释:
c.t
:会匹配以c开头,以t结尾,中间为任意一个字符的字符串
c..t
会匹配以c开头,以t结尾,中间为任两个字符的字符串
3.3 匹配特定字符集
-
使用
[xxx]
包裹的内容表示匹配特定字符集中中的一个字符
匹配特定字符集.png -
解释:
[abcd]会匹配a or b or c or d。所以c[abcd]t会匹配" cat "和" cbt "而不会匹配" cet "
3.4 匹配特定字符集区间
-
[x-x]
表示匹配一个特定的区间 - 常用的字符集区间
[a-z]:匹配所有小写字母区间
[A-Z]:匹配所有大写字母区间
[0-9]:匹配所有数字区间
[A-z]: 匹配从 ASCIIA到ASCIIz的所有字符(不仅仅匹配所有字母,还匹配在 ASCII 表中 A 到 z 中的字符,如 [ 和 ^ 等)
[A-Za-z0-9] :匹配所有的大小写字母和数字
匹配字符集.png
3.5 非字符集的匹配
- 使用场景:需要排除一组不需要匹配的字符集
-
^
是将字符集合中的所有字符都取消匹配 -
^
要写扎起字符集[]
内
非字符集的匹配.png
- 解释:
[^a-z] 匹配所有不是小写字母的字符
4. 元字符
4.1 转义字符及补充
- 正则中的元字符.都需要加上
\
转义 - 需要匹配
\
则需要使用\\
or\\\
来实现
\转义字符的补充.png
\转义字符的补充2.png
4.2 常用元字符
元字符 | 描述 |
---|---|
[\b] | 退格符 |
\f | 换页符 |
\n | 换行 |
\r | 回车 |
\t | 制表符 |
\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]) |
原字符的使用1.png
原字符的使用2.png
5. 匹配次数&多次匹配的使用
5.1 "1+"次匹配(一次以上匹配)
-
+
表示匹配一个或者多个字符。例如,a将匹配"a",而a+则匹配一个或者多个"a" - 当在字符集合上使用+的时候,需要将+符号放在集合外面
一次以上的匹配.png
字符集一次以上的匹配.png
5.2 "0+"次匹配(0次以上匹配)
- 匹配零个或更多字符的时候,可以使用
*
元字符
0次以上匹配.png
0次以上字符集匹配.png
5.3 0or1次匹配(匹配0个或者1个字符)
-
?
匹配零个或者一个字符。所以:?非常适合于在文本中匹配一个可选的字符
5.4 匹配次数-精确匹配次数
- 指定匹配的次数。次数可以在
“ { ”和“ } ”
之间指定,表示在{}
之前的字符执行几次匹配
指定次数匹配.png
5.5 匹配次数-至少匹配次数
- 至少匹配次数:只指定匹配次数的最小值。eg:
{2,}
意味着匹配至少两次 - 次数区间匹配:eg:
{2,3}
意味着最少匹配 2次,最多匹配3次 -
?和{0,1}的功能是一样的,+和 {1,}的作用是一样的
至少区间匹配次数.png
至少匹配次数.png
6. 贪婪匹配
-
先看个🌰,但是匹配结果并不是我们想要的结果
贪婪匹配.png - 为什么没有像预期匹配两个cat?
- 这是因为
*
和+
都是贪婪匹配。也就是说,正则表达式总是寻找最大的匹配,而不是最小的,设计如此,我觉得的就像优先级一样,贪婪匹配的优先级最低,匹配程度最广 - 贪婪匹配的时候就要使用这些量词的非贪婪匹配(匹配尽可能少的字符).非贪婪量词是在量词后面加上
?
- 这是因为
贪婪量词 | 非贪婪量词 |
---|---|
* | *? |
+ | +? |
{n,} | {n,}? |
非贪婪量词.png
7. 匹配边界
- 字符串边界匹配的元字符是
^
和$
,分别用于字符串的开始和结束 -
注意:
^
如果位于集合开始处的话,则表示否定;如果在集合外面,则将匹配字符串的开始位置 - 🌰🌰🌰:
[^a-z]
: 表示匹配非小写字符
^[a-z]
: 表示匹配字符串的开始位置,第一个字符匹配小写字符
匹配边界(开始).png
匹配边界(结束).png
-
综合实例,实际开发中很多这样的需求,以xx开头,以xx结尾的字符串校验,或者字符串中不允许有其它字符等等
综合例子.png
综合例子错误.png
8. 实战
- 复杂的正则都是由基本的组成
- 但是复杂的语法,类似语法糖的写法依然很多,值得慢慢探索
-
实操和应用可以看下我的另一篇
正则表达不再靠control+v(实操篇)