用java写一个从字符串中找出手机号,并进行脱敏处理的算法
时间: 2024-04-02 18:35:19 浏览: 15
可以使用正则表达式来匹配手机号码,然后使用字符串的替换方法进行脱敏处理。具体实现如下:
```java
public static String desensitizePhone(String str) {
Pattern pattern = Pattern.compile("(?<!\\d)(?:(?:1[358]\\d{9})|(?:861[358]\\d{9}))(?!\\d)");
Matcher matcher = pattern.matcher(str);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
String phone = matcher.group();
String desensitizedPhone = phone.substring(0, 3) + "****" + phone.substring(7);
matcher.appendReplacement(sb, desensitizedPhone);
}
matcher.appendTail(sb);
return sb.toString();
}
```
代码解释:
- 使用正则表达式 `(?<!\d)(?:(?:1[358]\d{9})|(?:861[358]\d{9}))(?!\d)` 匹配手机号码,其中 `(?<!\d)` 和 `(?!\d)` 是负向零宽断言,表示手机号前后不能有数字,这样可以避免误匹配;
- 使用 `Matcher` 对象的 `find()` 方法查找所有匹配的手机号码;
- 使用 `StringBuffer` 对象的 `appendReplacement()` 方法将匹配的手机号码替换为脱敏后的手机号码,替换规则为:手机号码前三位保留,中间用 `****` 替换,手机号码末四位保留;
- 使用 `appendTail()` 方法将剩余的字符串添加到 `StringBuffer` 对象中;
- 最后返回 `StringBuffer` 对象转换成的字符串。
示例:
```java
String str = "我的手机号码是13812345678,你的手机号码是8615812345678,他的手机号码是15012345678。";
String desensitizedStr = desensitizePhone(str);
System.out.println(desensitizedStr);
```
输出结果:
```
我的手机号码是138****5678,你的手机号码是8615****5678,他的手机号码是150****5678。
```