一、前言
在日常开发中,数据格式验证是保证系统安全的重要环节。本文将使用Java正则表达式实现两个常见的验证场景:电话号码(含手机/座机)和电子邮箱的格式校验,并详细解析实现原理。
二、实现目标
-
电话号码验证:
-
手机号:13/14/15/17/18/19开头的11位数字
-
座机号:区号(3-4位)- 电话号码(7-8位),支持短横线连接
-
-
邮箱验证:
-
用户名:至少2位字母/数字/下划线
-
域名:支持二级/三级域名(如xxx.com / xxx.com.cn)
-
三、手机号验证实现
正则表达式解析
(1[3-9]\\d{9})|(0\\d{2,7}-?[1-9]\\d{4,19})
结构分解:
-
手机号部分:
-
1[3-9]
:匹配13-19开头的运营商号段 -
\\d{9}
:匹配后续9位数字
-
-
座机号部分:
-
0\\d{2,7}
:匹配区号(3-8位) -
-?
:可选短横线连接符 -
[1-9]\\d{4,19}
:确保电话号码不以0开头
-
四、邮箱验证实现
正则表达式解析
\\w{2,}@(\\w{2,20}\\.\\w{2,10}){1,2}
结构分解:
-
用户名部分:
-
\\w{2,}
:至少2位字母/数字/下划线
-
-
域名部分:
-
(\\w{2,20}\\.)
:匹配二级域名(如"qq.") -
\\w{2,10}
:匹配顶级域名(如"com") -
{1,2}
:支持二级或三级域名(如"xxx.com.cn")
-
五、完整代码实现
import java.util.Scanner;
public class Validator {
public static void main(String[] args) {
validatePhone();
validateEmail();
}
private static void validateEmail() {
while (true) {
System.out.println("请输入邮箱地址:");
Scanner sc = new Scanner(System.in);
String email = sc.nextLine();
if (email.matches("\\w{2,}@(\\w{2,20}\\.\\w{2,10}){1,2}")) {
System.out.println("邮箱格式正确");
break;
} else {
System.out.println("邮箱格式错误!示例:name@domain.com");
}
}
}
private static void validatePhone() {
while (true) {
System.out.println("请输入手机号|座机号:");
Scanner sc = new Scanner(System.in);
String phone = sc.nextLine();
if (phone.matches("(1[3-9]\\d{9})|(0\\d{2,7}-?[1-9]\\d{4,19})")) {
System.out.println("号码格式正确");
break;
} else {
System.out.println("号码格式错误!手机号示例:13812345678,座机示例:010-1234567");
}
}
}
}
六、优化建议
-
增强座机号验证:
// 更精确的座机号匹配(3-4位区号 + 7-8位号码)
(0\\d{2,3}-?[1-9]\\d{6,7})
2.支持带连字符的邮箱:
// 允许域名包含短横线
[a-zA-Z0-9-]{2,20}\\.[a-zA-Z0-9-]{2,10}
3.国际号码扩展:
// 添加国际区号支持
(\\+\\d{1,4})?1[3-9]\\d{9}
七、总结
通过本文可以实现:
-
✅ 基础手机/座机号验证
-
✅ 常见邮箱格式校验
-
🔧 可扩展性强,方便添加新规则
注意事项:
-
实际生产环境建议使用Apache Commons Validator等成熟工具
-
需结合数据库校验保证数据唯一性
-
前端应做双重验证提升用户体验