正则整理
正则表达式手册:https://tool.oschina.net/uploads/apidocs/jquery/regexp.html
转义网站:https://www.bejson.com/
练习网站:https://regexr-cn.com/
由于最近在学习公司日志配置,其中数据匹配使用了正则,对此进行了回顾。
1.简单案例
正则可以匹配字符串中的字符,比如匹配下面字符串中的2020
2.字符数组 []
如果只是使用正则表达式来匹配文本,没有什么意义,毕竟检测一个文本中是否有另一个字符串本来就非常简单,正则表达式强大的地方在于它可以迅速地用极简单的方式达到字符串的复杂控制,字符组区间([]
)允许匹配一组可能出现的字符。
可以发现[Pp]
既可以匹配大写的P
也可以匹配小写的p。
练习:
使用字符组匹配Ruby
、Rube
、ruby
、rube
2.1区间
有一些常见的字符组非常大,比如,我们要匹配任意的数字,如果依照上述代码,每次我们都需要使用[0123456789],这样非常繁琐,
为了适应这一点,正则表达式引擎在字符组中使用连字符(-)
代表区间,依照这个规则,总结出三点:
- 要匹配任意数字可以使用
[0-9]
; - 如果想要匹配所有小写字母,可以写成
[a-z]
; - 想要匹配所有大写字母可以写成
[A-Z]
。
练习:
接下来需要你匹配数据所有的数字、小写字母和大写字母。
-
abcdefg
-
012345678
-
987654321
-
ABCDEFG
4.取反
匹配不包含数字的字符组,可以通过在字符数组开头使用 ^
字符实现取反操作,从而可以反转一个字符组(意味着会匹配任何指定字符之外的所有字符)。
比如:n[^e]
的意思就是n
后面的字母不能为 e
练习:
爱
后面不包含你
的数据
练习2:
匹配字母
-
abc01
-
ddd02
-
afcf01
-
acac11
-
321
-
acef33
-
bbc000
不能匹配的
-
ABCDEFG789654
-
CODEJIAONANG
-
ghjkloiqwtq
-
poiuy98765
-
msstgr4567
-
gg8888888
-
88888888999
3.匹配特殊字符
正则表达使用了 -
号代表了区间,但是我们有时候需要匹配的符号就是 -
号;这个时候我们需要对-
号进行转义操作,即 \-
。
在正则中使用 \
就可以进行对特殊符号进行转义,对 -
进行转义就可以表示为 \-
,即 \-
就代表了 -
号本身。
练习:
4.取反
可以通过在字符数组[]开头使用 ^
字符实现取反操作,从而可以反转一个字符组(意味着会匹配任何指定字符之外的所有字符)。
5.快捷匹配
常用的快捷匹配
\w 表示字母(小写表示取对应属性值,大写表示取反 \W等价于[^a-zA-z])
\d 数字 \D 非数字
\s 空格
\b 单词边距,一个单词的结尾
\bmaster\b
就仅匹配有边界的master
单词。
6.开始和结束
正则表达式中 ^
指定的是一个字符串的开始,$
指定的是一个字符串的结束。
匹配以p开始,n结尾的字符
7.任意字符
.
字符代表匹配任何单个字符,它只能出现在方括号以外。
值得注意的是: .
字符只有一个不能匹配的字符,也就是换行符(\n
)
8.可选字符
有时,我们可能想要匹配一个单词的不同写法,比如color
和colour
,或者honor
与honour
。
这个时候我们可以使用 ?
符号指定一个字符、字符组或其他基本单元可选,这意味着正则表达式引擎将会期望该字符出现零次或一次。
综合练习:
\(?code[\.\-\)\(\s]?jiaonang\)? |
---|
需要匹配的
-
codejiaonang
-
code.jiaonang
-
code-jiaonang
-
(code)jiaonang
-
code(jiaonang)
-
code jiaonang
不能匹配的
-
codeabjiaonang
-
codjiaonang
-
asdd21333121mn
-
asdiouiqweuhhk
-
codjiaonang
-
jiaonangcode
9.重复区间
在一个字符组后加上{N}
就可以表示在它之前的字符组出现N
次。 eg:\d{3}
我们不知道具体要匹配字符组要重复的次数,就可以使用{M,N}
,M
是下界而N
是上界。
还可以使用两个速写字符指定常见的重复情况,可以使用 +
匹配1
个到无数个,使用 *
代表0
个到无数个。
即:+
等价于{1,}
,*
等价于{0,}
练习
匹配电话号码,假设电话号码可以有下列两种方式:
- 0XX-XXXXXXX,例如
020-8810456
; - 0XXXXXXXXX,例如
0208810456
。
020
代表区号,8810456
是电话号码,区号第一个数字必须是0
,电话号码的第一个数字必须大于等于1。
需要匹配的
-
010-7810456
-
020-8810456
-
030-1810456
-
0208810456
-
0107810456
-
0107811356
不能匹配的
-
020-88104XX
-
01007214569
-
3208810456
-
010-08104560
-
010-0810456
120-8810456
10.高级部分
(1)分组
在正则表达式中还提供了一种将表达式分组的机制,当使用分组时,除了获得整个匹配。还能够在匹配中选择每一个分组。用"()"括号限制一个分组范围,其中?<name>表示给该分组的名字。
(2)非捕获分组
有时候,我们并不需要捕获某个分组的内容,但是又想使用分组的特性。这个时候就可以使用非捕获组(?:表达式)
,从而不捕获数据,还能使用分组的功能。例如想要匹配两个字母组成的单词或者四个字母组成的单词就可以使用非捕获分组:
eg:提取目标数据中的电话号码
需要匹配的
-
01-75855
-
0731-75855
-
12345-75855
-
tel:75855
需要提取的
-
75855
-
75855
-
75855
-
75855
(3)分组的回溯引用
![霍之锐 > 正则表达式 > image2021-8-9_0-49-24.png](http://wiki.baidu.com/download/attachments/1618334433/image2021-8-9_0-49-24.png?version=1&modificationDate=1628441364000&api=v2)
(4)正向先行断言
很多人也称先行断言和后行断言为环视,也有人叫预搜索,其实叫什么无所谓,重要的是知道如何使用它们!
先行断言和后行断言总共有四种:
- 正向先行断言
- 反向先行断言
- 正向后行断言
- 反向后行断言
正向先行断言:(?=表达式)
,指在某个位置向右看,表示所在位置右侧必须能匹配表达式;
eg:我喜欢你 我喜欢 我喜欢我 喜欢 喜欢你
如果要取出喜欢两个字,要求这个喜欢后面有你,这个时候就要这么写:喜欢(?=你)
,这就是正向先行断言。
(?=.*?[a-z])(?=.*?[A-Z]).+
这段正则表达式规定了匹配的字符串中必须包含至少一个大写和小写的字母。
现在请你编写正则表达式进行密码强度的验证,规则如下:
- 至少一个大写字母
- 至少一个小写字母
- 至少一个数字
- 至少
8
个字符
左边为需要你的正则需要匹配的,右边的字符串是你的正则不需要匹配的。
(?=.*?[A-Z])(?=.*?[a-z])(?=.*?\d).{8,}
(5) 反向先行断言
反向先行断言(?!表达式)
的作用是保证右边不能出现某字符。
例如: 我喜欢你 我喜欢 我喜欢我 喜欢 喜欢你
如果要取出喜欢两个字,要求这个喜欢后面没有你,这个时候就要这么写:喜欢(?!你)
,这就是反向先行断言。