让代码更优雅 - 正则表达式(十)

224 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情

导言

本篇列举几个我们开发中常用的正则表达式,也是对前面内容的一种实践。后面有用到直接用就好了,随着时代的发展,像手机号码、身份证号、QQ号等规则都有可能发生变化,后续会持续更新。

常用正则表达式

浮点数

浮点数涉及到正负数、整数、小数,正负号用[+-]?,整数或小数\d+(?:\.\d+)?,0.5还有可能直接表示成.5,负数也可能这么表示。

[+-]*\d*(?:\.\d+)?|

十六进制数

十六进制除了0-9之外,还有A-F(或a-f)来表示10-15,所以正则可以这样写/[0-9A-Fa-f]+/

手机号码

手机号11位数这个是固定的,最不严格的匹配就直接用\d{11},可以更稍微严格一点,限制前2位:

1[3-9]\d{9} // 限制前2位

image.png

如上是公开的各运营商号段,我们可以进而限制前3位、前4位甚至前5位,写正则不难,难的是后期维护成本比较高,因为号段经常会变。如果对号码匹配要求不高,就限制前2位即可。

邮政编号

邮编一般是6位数字,可以写成\d{6},但6位数字也可能是别的信息,那我们最好加个断言:

const reg = /\b\d{6}\b/ // 单词边界
const str = '123456'
reg.test(str) // true

身份证号

身份证号有可能是15位或18位,如果是18位,最后一位可能是X/x,并且第1位不能是0

const reg = /[1-9]\d{14}(\d{2}[0-9Xx])?/
const str = '230968200001022345'
reg.test(str) // true

QQ号码

QQ号码最小10000,且第一位不能是0,到目前为止最多10位数:

[1-9]\d{4-9}

邮箱

邮箱的组成比较复杂,格式是用户名@主机名,更具体一点可以是xxx@xxx.xxx

[\w.+-]+@[\w.]+\.[\w.]+

中文字符

中文属于多字节Unicode字符,码值范围是4E00-9FFF,JavaScript中表示Unicode的格式是 \u码值,Python、Java表达方式也相同,PHP略有不同:\u{码值}, 这样来判断是否是中文字符就很简单了

[\u4E00-\u9FFF]]

IPv4

IPv4的格式是xxx.xxx.xxx.xxx,4位数字都用.隔开,每位数字范围是0-255,一般的话,不校验每个数字的大小,主要对格式进行校验。可以简单的写成:

\d{0,3}(\.\d{0,3}){3}

日期

以格式是yyyy-mm-dd为例,月份1-12,并且1月可以表示成1或01,日可以是1-31,1日也可以表示成1或01

\d{4}-(?:0?\d|1[0-2])-(?:[12]\d|3[01]|0?\d|)