上一篇文章:# 前端的这些正则方法太牛了,直接让我的开发效率高了好几倍!
组成正则的字符
确定字符
一个最简单的正则表达式,就是一组确定字符,如hello就是一个正则表达式
/hello/gm
它会匹配下文中的hello
hello曾小红 ,welcome to regex learn site
hello 是一组确定字符表达式,它严格按照顺序匹配文中h e l l o。然后相关工具会返回匹配的位置,一个简单正则交互就完成了。
不确定字符
正则使用场景中,搜索的字符大多是不完全确定的。如下文中的例子:
【阿里云】您正在登录验证,验证码2571,
切勿将验证码泄露于他人,本条验证码有效期15分钟。
短信中的验证码是不确定的,只知道一个范围--是4位数字。这时就可以通过元字符**\d去匹配,它表示一个0-9中一个数字**。因为验证码是4个数字,所以匹配正则应是**\d\d\d\d** .
/\d\d\d\d/m
混合字符
更多正则匹配场景中,是确定与不确定的字符混合在一起。如要匹配下文中年龄就得这么写\d\d岁:
曾小红,男,举重运动员,28岁,体重56KG,身高175cm。最好成绩:挺举98KG
如果要匹配体重得这么写体重\d\dKG,体重与KG是确定的,中间\d\d是不确定的。
小结:
组成正则表达式的字符,有些是确定的,有些是不确定的,正则编写时要尽可能缩小不确定字符的范围。关于\d这类表范围字符,正则表达式中还有好几个,对于写好正则,非常重要。
范围字符
对于确定字符可以直接匹配,对于不确定的可以用范围字符来代替。下表是常用范围字符
字符 | 描述 | 兼容性 |
---|---|---|
.任意字符 | 除换行符外的任意单个字符 | 添加s修饰符,可以让.包括换行符 |
\w 单词字符 | 字母、数字、下划线任意单个字符。大写\W 表示非单词字符 | 在python \w还可以表示汉字 |
\d 数字 | 0-9任意单个数字。大写\D 表示非数字 | |
\s 空白字符 | 空格、tab制表符、换行都属于空白字符。大写\S 非空白字符 |
.任意字符
. 可以任意单个字符,字母、数字、汉字、标点符号,甚至是**.**自已。
练习
匹配所有姓张的名字
/张../gm
姓名 / 籍贯 体重 生日
于小彤 / 中国辽宁 / 63 KG / 1994-05-27
张惠妹 / 台湾台东县卑南乡 / 46 KG / 1972-08-09
沈佳妮 / 中国上海 / 51 KG / 1983-05-22
沈丹萍 / 中国南京 / 65 KG / 1960-02-19
王紫逸 / 中国香港 / 65 KG / 1986-12-15
吴健 / 中国淄博 / 68 KG / 1978-01-03
金荷娜 / 韩国 / 48 KG / 1978-02-21
张曼玉 / 中国 / 40 KG / 1964-09-20
薛佳凝 / 哈尔滨 / 45 KG / 1978-08-13
\w单词字符
\w表字母、数字、下划线中任意单个字符。
练习
匹配css样式中所有颜色代码
以#开头的6位十六进制数用于表示颜色,规律如下 :
- 以#开头,以;结尾
- 6个字母或数字
记得结尾要包含 ;
/#\w\w\w\w\w\w;/gm
html{
background-color: **#1e1e1e;**
}
body{
color: #55432c;
background-color: **#5b3d17;**
}
div{
color: **#ff0000;**
}
注意:在正则表达中范围字符是区分大小写的,通常是表示反义。如\W 表示\w之外的字符
\d 数字符
\d 表示0-9任意单个字符。
练习
请匹配文中所有的生日
小提示:复杂的表达式,可以先编写确定部分,在写不确定部分。
注:匹配的结果不包含空格
/\d\d\d\d-\d\d-\d\d/gm
姓名 / 籍贯 体重 生日
于小彤 / 中国辽宁 / 63 KG / 1994-05-27
张惠妹 / 台湾台东县卑南乡 / 46 KG / 1972-08-09
沈佳妮 / 中国上海 / 51 KG / 1983-05-22
沈丹萍 / 中国南京 / 65 KG / 1960-02-19
王紫逸 / 中国香港 / 65 KG / 1986-12-15
吴健 / 中国淄博 / 68 KG / 1978-01-03
金荷娜 / 韩国 / 48 KG / 1978-02-21
张曼玉 / 中国 / 40 KG / 1964-09-20
薛佳凝 / 哈尔滨 / 45 KG / 1978-08-13
大写的\D表示反义,即\d之外的字符
\s空白字符
\s表示单个空白字符,其包括空格、tab制表符、换行。注意:退格不属于空白字符
大写的\S表示反义,即非空白字符,也是正则中常用字符
我们已经学会了四个表范围的字符 . \w \d \s ,非常好用,但它表达的范围是固定的,不灵活。
如果我要匹配一个16进制的数字,它的范围是0-9数字或A-F字母组成。无法使用\w,因为它表示所有数字和字母。这时就需要自定义范围,十六进制范围写法是:[0-9A-F]。接下来我们系统学一下自定义范围的语法
自定义范围字符
定义范围指由多个字符,多个范围字符组成的集合,取其中任意一个。
字符 | 描述 | |
---|---|---|
[abc123] 任意范围 | 一组由确定字符组成的字符集,取其中一个 | |
[0-9] 数字区间范围 | 指定数字范围集,[0-9] 等同于\d | |
[a-z] 字母区间范围 | 指定字母范围集。 | |
[\d\w\s] 固定范围集 | 由多个固定范围集,组成一个更大的集 | |
[0-9A-F\s] 混合集 | 上述四个自定义混合组成的集 | |
[^ ] 排除范围 | 表示[ ]集之外的任单个字符,如[^0-9] 表示非数字,效果等同于\D |
是不是开始复杂了?其实也还好,无非就是几组小集合,通过[ ]组合成一个大集合。
小提示:可以把[ ]理解成一个框,什么都往里装
[abc123] 任意范围
[ ] 由指定字符组成的范围集,可匹配其中任意一个。[abc123%#]表示匹配abc123%#其中之一。
练习
请使用[]匹配姓:张、沈、薛的名字
/[张沈薛]../gm
姓名 / 籍贯 体重 生日
于小彤 / 中国辽宁 / 63 KG / 1994-05-27
张惠妹 / 台湾台东县卑南乡 / 46 KG / 1972-08-09
沈佳妮 / 中国上海 / 51 KG / 1983-05-22
沈丹萍 / 中国南京 / 65 KG / 1960-02-19
王紫逸 / 中国香港 / 65 KG / 1986-12-15
吴健 / 中国淄博 / 68 KG / 1978-01-03
金荷娜 / 韩国 / 48 KG / 1978-02-21
张曼玉 / 中国 / 40 KG / 1964-09-20
薛佳凝 / 哈尔滨 / 45 KG / 1978-08-13
[0-9] 区间范围
[1-5] 表示 1、2、3、4、5 中任意一个字符。
练习
请用[n-m]匹配下文中合法的日期
/\d\d\d\d-[01]\d-[0-3]\d/gm
1970-59-19
1979-07-23
1974-05-23
1986-08-23
1979-02-08
1967-31-27
1981-09-49
1978-04-17
1976-08-13
1979-01-06
1979-10-15
1981-01-05
1979-10-75
1979-01-05
1967-08-12
[a-z0-9] 混合范围集
[a-c\d] 表示 a、b、c字母或0-9数字中任意一个字符。等同于[a-c0-9]
练习
请匹配合法的颜色代码
以#开头的6位十六进制数用于表示颜色,规律如下 :
以#开头,以;结尾
由6个字母或数字组成
16进制字母只能是a-f
匹配结果包括#和;
/#[a-f\d][a-f\d][a-f\d][a-f\d][a-f\d][a-f\d];/gm
或
/#[\da-f]{6};/gm
html{
background-color: #1e1e1e;
}
body{
color: #55432c;
background-color: #5b3g17;
}
div{
color: #ff0000;
}
[^ ] 排除范围集
[^ ] 排除范围集中的字符,该集可以指定任意字母、数字、或其它固定集。举例[^\D8-9] 表示排除所有非数字,以及8和9。等同于[0-7]
练习:请匹配80年代或90年代以外的日期
提示: 通过[^8-9] 排除年份中的第3位。
/\d\d[^8-9\D]\d-\d\d-\d\d/gm
姓名 / 籍贯 体重 生日
于小彤 / 中国辽宁 / 63 KG / 1994-05-27
张惠妹 / 台湾台东县卑南乡 / 46 KG / 1972-08-09
沈佳妮 / 中国上海 / 51 KG / 1983-05-22
沈丹萍 / 中国南京 / 65 KG / 1960-02-19
王紫逸 / 中国香港 / 65 KG / 1986-12-15
吴健 / 中国淄博 / 68 KG / 1978-01-03
金荷娜 / 韩国 / 48 KG / 1978-02-21
张曼玉 / 中国 / 40 KG / 1964-09-20
薛佳凝 / 哈尔滨 / 45 KG / 1978-08-13
[.$^]范围集中的特殊字符
.表示任意字符,但在[.] 中它表示的是 . 字符本身。甚至是^、-、[、] 范围集本身语法,如果不是在恰当位置,也表示其字符本身。为避免混淆建议大家在范围集中匹配特殊字符时,统一加上 转义符 \。 如 [^.] 表示匹配 ^ 或 .
范围集用来匹配中文字符区间,为了避免篇幅过长,我们把它放在特殊字符篇讲解。
\转义特殊字符
如果要匹配[、*等特殊字符,需要加入一个转义符:\即可。转义符也可加在范围字符中如[-] 表示一个普通的 - 。
总结练习
题解:.不包括换行符,但\s包括。
解题:大写\S \W \D 表示取反。如:\s表示空白,\S表示非空白,那么[\s\S]加一起就等于全部了。
练习
请匹配文中正确的车牌号码
普通车牌特征:
- 第1位是表籍贯的汉字
- 第2位是表城市的大写字母,不包括I和O。因为容易和数字0和1混淆
- 后5位是字母加数字,也不包括I和O
提示:如何表示除IO之外的字母呢?
小技巧:后5位字符范围都是一样,如果不想重复写,可在范围集后面加个{5}试试。
/[湘皖鲁][^IO][0-9A-HJ-NP-Z]{5}/gm
湘C4VQR6
湘G9NRCE
湘A3EWAY
湘D4U9U5
湘C6FBKN
湘A0Z5VK
湘D2HQUS
皖DOCLYJ
皖E74V7I
皖E9T3RK
皖11WEIZ
鲁C67RSN
鲁C8WU2C
鲁E2S1EF
A湘418KB
鲁P9RNA7
鲁B1ETSP
鲁C195ES
N鲁5FSTV
鲁Z140YQ
总结
- 正则是由确定字符和不确定字符组成的
- 不确定的的字符,要尽可能缩小其表示范围
- . \w \d \s 表示四个固定的范围,范围由大到小
- 用于自定义范围集,可指定字符、字符区间、或固定范围集。