正则表达式大全 - Java 版

Last Modified: 2023/08/10

概述

本文收录了常用的正则表达式,虽然本文多方查证,力求正则表达式的准确性,但是存疏漏在所难免,请发现问题的同学点击下面的反馈按钮将问题反馈作者。

手机号码

宽松点的,只要是以 1 开头的 11 位数字便认为是正确的手机号码,例如淘宝网就是这样

^1\\d{10}$

严格点的,去除 12 开头,12 开头的一般不是民用,去掉 16 开头的虚拟号段

^1[345789]\\d{9}$

注意网上流传的匹配手机号的正则是 ^1[34578]\\d{9}$,这个正则已经可以退休了,它漏掉了 19 开头的手机号。

一般这两个就差不多能应付绝大多数场景了,如果需要更精细的,点这里

电话号码

^\\d{3}-\\d{8}$|^\\d{4}-\\d{7}$

固话格式为: 区号-座机号码,区号一般为 3 到 4 位,座机号则是 7 到 8 位。

金额、数字类

正整数

^[1-9]\\d*$

包含两位小数的金额

^([1-9]\\d*|0)\\.\\d{2}$

注意这个只能匹配小数,不能匹配正整数。

包含一至两位小数的金额

^([1-9]\\d*|0)\\.\\d{1,2}$

注意这个只能匹配小数,不能匹配正整数。

正整数或者包含一至两位小数的金额

如果金额包含 0,使用

^([1-9]\\d*|0)(\\.\\d{1,2})?$

如果要求金额大于 0,则可以使用

^([1-9]\\d*|0)\\.\\d{1,2}$|^[1-9]\\d*$

如果要求金额可正可负,可能包含一到两位的小数,且大于 0,可以使用

^-?([1-9]\\d*|0)\\.\\d{1,2}$|^[1-9]\\d*$

如果要求金额可正可负,可能包含一到两位的小数,包含 0,可以使用

^-?([1-9]\\d*|0)(\\.\\d{1,2})?$

Url

^https?://(www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)$

以上正则来自于 stackoverflow

Email

^[\\w!#$%&’*+/=?`{|}~^-]+(?:\.[\\w!#$%&’*+/=?`{|}~^-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}$

来自 how to do in java

如果是 Java,多半会使用 spring,在 spring 中可以通过注解 @Email 就可以完成 email 校验。

身份证

^(\\d{6})(\\d{4})(\\d{2})(\\d{2})(\\d{3})([0-9]|X|x)$

IP 地址

^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$

以上正则表达式来自 oreilly.com

^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$

以上正则来自 stackoverflow。正则表达式写法很灵活,根据项目的不同,实际需要校验的严格程度也不同,因此存在多种写法也并不稀奇。

是否包含中文

[\\u4e00-\\u9fa5]

基本汉字的码点范围为 \u4e00-\u9fa5,因此上面的可以用来验证是否包含中文的基本汉字。如果汉字不在基本汉字范围内,则匹配失败,看下面的例子:

// false
Pattern p = Pattern.compile("[\\u4e00-\\u9fa5]");
System.out.println(p.matcher("龦").matches());

属于基本汉字补充(码点范围 9FA6-9FFF),不在上面的码点范围内,因此不能匹配成功。更多信息请参考汉字 Unicode 编码范围

邮政编码

邮编就是 6 位数字,因此匹配如下

/^\\d{6}$/

网上流传甚广的一个版本为 ^[1-9]\\d{5}$,但事实上 0 开头的邮编是存在的,例如河北石家庄。

日期类

匹配 YYYY-MM-DD 格式的日期,该表达式考虑了闰年等因素,因此较为复杂,来自 最强日期正则表达式

^(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)$

事实上,我们可能不需要校验的这么严格,因为前端大部分日期都是选择的,而不是输入的,后台通常需要调用 parse 解析日期,如果解析失败,日期自然就是不合法的。如果只需要简单校验下可以使用下面的写法:

^\\d{4}-\\d{2}-\\d{2}$

仅包含字母和数字

^[A-Za-z0-9]+$

以上包含了大写字母,如果不希望包含大写字母

^[a-z0-9]+$
有问题吗?点此反馈!

温馨提示:反馈需要登录