一、实战需求分析
在日常开发中,我们经常需要处理文本数据中的联系方式提取。本文将通过一个真实案例演示如何使用Java正则表达式匹配以下内容:
-
手机号码
-
电子邮箱
-
座机号码(带区号)
-
400热线电话
二、正则表达式优化版
String regex = "(1[3-9]\\d{9})" + // 手机号
"|([a-zA-Z0-9_-]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,2})" + // 邮箱
"|(0\\d{2,3}-?[1-9]\\d{6,7})" + // 座机
"|(400-?618-?\\d{4})"; // 400热线
三、代码解析与优化
1. 手机号码匹配
1[3-9]\d{9}
解析:
-
第1位固定1
-
第2位3-9(匹配运营商号段)
-
后接9位数字
2. 邮箱匹配优化
[a-zA-Z0-9_-]+@[a-zA-Z0-9]+(\.[a-zA-Z]+){1,2}
-
支持中划线、下划线
-
域名限制2-3级(如.cn/.com.cn)
-
排除非法特殊字符
3. 座机号码匹配
0\d{2,3}-?[1-9]\d{6,7}
-
区号3-4位(0开头)
-
主机号码不以0开头
-
支持区号与号码间的可选短横
4. 400热线匹配
400-?618-?\d{4}
-
固定400开头
-
中间618为服务商代码
-
支持灵活分隔符
四、完整实现代码
public class ContactExtractor {
public static void main(String[] args) {
String text = """
学习Java,
电话:18512516758,18512508907,
或者联系邮箱:boniu@itcast.cn,
座机电话:01036517895,010-98951256,
邮箱:bozai@itcast.cn,
邮箱2:dlei0009@163.com,
热线电话:400-618-9090, 400-618-4000,4006184000,4006189090""";
String regex = "(1[3-9]\\d{9})"
+ "|([a-zA-Z0-9_-]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,2})"
+ "|(0\\d{2,3}-?[1-9]\\d{6,7})"
+ "|(400-?618-?\\d{4})";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
System.out.println("匹配到联系方式: " + matcher.group());
}
}
}
五、测试案例验证
成功匹配案例:
-
手机:18512516758
-
座机:010-98951256
-
热线:400-618-9090
不匹配情况:
-
无效手机:10234567890(第二位错误)
-
错误邮箱:user@.com(域名不完整)
-
错误座机:010-0123456(主机号以0开头)
六、常见问题排查
-
部分号码未匹配
检查是否忘记处理空白字符,建议先使用text.replaceAll("\\s", "")
清理文本 -
邮箱匹配过多
添加边界检查:\\b
开头结尾限定符 -
区号识别错误
明确区号长度:0\d{2}
(3位)或0\d{3}
(4位)
七、正则表达式调试技巧
-
使用在线工具验证(如regex101.com)
-
分步测试各子表达式
-
添加非捕获组
(?:...)
优化性能 -
使用
^
和$
进行严格模式测试
八、总结
通过本文的实战案例,我们实现了:
✅ 多类型联系方式匹配
✅ 灵活的分隔符处理
✅ 严格的格式验证
正则表达式在数据处理中具有重要作用,但需要注意不同场景下的特殊要求。建议在实际使用时结合具体业务需求进行调整,并通过充足的测试用例验证匹配效果。