『前端学正则 』基本字符匹配,只看这篇文章就足够了!

340 阅读10分钟

上一篇文章:# 前端的这些正则方法太牛了,直接让我的开发效率高了好几倍!

组成正则的字符

确定字符

一个最简单的正则表达式,就是一组确定字符,如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
C4VQR6G9NRCEA3EWAYD4U9U5C6FBKNA0Z5VKD2HQUSDOCLYJE74V7IE9T3RK
皖11WEIZ
鲁C67RSNC8WU2CE2S1EF
A湘418KB
鲁P9RNA7B1ETSPC195ES
N鲁5FSTV
鲁Z140YQ

总结

  • 正则是由确定字符和不确定字符组成的
  • 不确定的的字符,要尽可能缩小其表示范围
  • . \w \d \s 表示四个固定的范围,范围由大到小
  • 用于自定义范围集,可指定字符、字符区间、或固定范围集。