正则表达式大全 - Java 版
概述
本文收录了常用的正则表达式,虽然本文多方查证,力求正则表达式的准确性,但是存疏漏在所难免,请发现问题的同学点击下面的反馈按钮将问题反馈作者。
手机号码
宽松点的,只要是以 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。
^[\\w!#$%&’*+/=?`{|}~^-]+(?:\.[\\w!#$%&’*+/=?`{|}~^-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}$
如果是 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]+$
温馨提示:反馈需要登录