Java正则表达式过滤手机号、身份证等常用信息

背景

在我们日常开发中,常常会用到一些固定信息,如:手机号、身份证等。也会对账户名,密码等信息作特定的限制。那么就需要过滤掉一些垃圾信息,保证数据的准确性。这里我们通过正则表达式对字符串进行匹配过滤。

正则表达式

正则表达式可以用字符串来描述规则,并用来匹配字符串。比如:”\\d”表示可以匹配一位0~9的数字,其中第一个”"是转义字符。如果想匹配多位字符需要在表达式后面加”{最小位数,最大位数}”({2}表示只能匹配2位数字):”\\d{4,10}”表示可匹配4-10位数字。在String中有一个方法matches就是用来匹配字符串或规则的, 实际运用如下:

1
2
3
4
5
6
7
8
public class Test {
public static void main(String[] args){
System.out.println("0".matches("\\d")); //结果:true
System.out.println("a".matches("\\d")); //结果:false
System.out.println("1234".matches("\\d")); //结果:false
System.out.println("1234".matches("\\d{4,10}")); //结果:true
}
}

一般来说,匹配规则习惯用[ ]括起来,匹配个数用{ }括起来,’^’匹配输入字符串的开始位置,’$’匹配输入字符串的结束位置,一般来说加上这个2个字符只是一个规范,加与不加效果都一样。常用的表达式如下:

表达式 匹配内容 表达式 匹配内容
[. ] 所有字符 [x|y] x或y
[\\d] 0-9的数字 [xyz] x或y或z字符集合
[0-9] 0-9的数字 [^a-z] 除a-z之外的字符
[a-z] a-z的字符 * 匹配前面的子表达式零次或多次
[A-Z] A-Z的字符 + 匹配前面的子表达式一次或多次
[\\u4E00-\\u9FA5] 中文字符 ? 匹配前面的子表达式零次或一次

代码工具类

在开发中我们常常会用到一些信息,我整理了一个过滤工具类。其中固定信息可以借鉴如电话、身份证。其余信息可以根据自己需求修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
public class InfoFilterUtil {
//匹配用户名
public static boolean checkUserName(String username) {
String regExp = "^[a-zA-Z0-9]{4,16}3$";
return username.matches(regExp);

}

//匹配密码
public static boolean checkPassword(String password) {
String regExp = "^[a-zA-Z0-9@/#.+=]{4,16}$";
return password.matches(regExp);
}

//匹配姓名
public static boolean checkName(String name) {
String regExp = "^[\\u4E00-\\u9FA5]{2,6}$";
return name.matches(regExp);
}

//匹配手机号
public static boolean checkPhone(String phone) {
String regExp = "^[1]([3-9])\\d{9}$";
return phone.matches(regExp);
}

//匹配手机验证码
public static boolean checkCaptcha(String code) {
String regExp = "^[0-9]{6}$";
return code.matches(regExp);
}

//匹配身份证
public static boolean checkIdCard(String s) {
String regExp = "^[1-9]\\d{5}(18|19|20|(3\\d))\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$";
return s.matches(regExp);
}

//匹配0-200字符
public static boolean check0_200Char(String s) {
String regExp = "^[\\u4E00-\\u9FA5A-Za-z0-9_]{0,200}$";
return s.matches(regExp);
}

//匹配1-200字符加()
public static boolean check1_200Char1(String s) {
String regExp = "^[\\u4E00-\\u9FA5A-Za-z0-9_()()]{1,200}$";
return s.matches(regExp);
}


//匹配0-400字符
public static boolean check400Char(String s) {
String regExp = "^([\\s\\S]*){0,400}$";
return s.matches(regExp);
}

测试

1
2
3
4
5
6
7
8
public class InfoFilterUtilTest {

public static void main(String[] args){
//过滤手机号
System.out.println("12345678910是不是手机号:"+InfoFilterUtil.checkPhone("12345678910"));
}
}

运行结果

1
12345678910是不是手机号:false

这是我在Github上开源项目中的其中一个工具类,目前过滤的信息并不多,有需要的可以联系我补充。也欢迎有兴趣的伙伴可以加入这个开源项目中来,贡献自己的力量。下面是项目的地址:

https://github.com/GerryMCzzZ/Java-Utils


Java正则表达式过滤手机号、身份证等常用信息
https://gerrymc.top/2021/01/12/java_info_filter/
作者
GerryMC
发布于
2021年1月12日
许可协议