Java 手机号中间四位隐藏 MySQL函数手机号四位隐藏 Oracle手机号隐藏 Java手机号码隐藏
一、情景描述
在日常开发工作中,遇到一个需求:用户的手机号信息,中间四位需要隐藏起来,保护用户隐私。一般在数据库中都是存储完整的手机号信息,如:13122334455 ,而实际界面上展示数据需求是:131****4455 ,可以在数据库层面处理,也可以在Java代码层面处理,本文分别记录 Java、MySQL、Oracle 实现手机号中间四位隐藏的功能实现。
二、java实现
1、使用正则表达式实现
/**
* @Description: 使用正则表达式实现
* @param phone
* @return String
* @version v1.0
* @author wu
* @date 2022年4月13日 下午11:05:52
*/
static String hidePhoneByRegular(String phone){
if(StringUtils.isNotBlank(phone) && phone.length() == 11) {
return phone.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2");
}
return phone;
}
2、使用字符串截取,拼接实现
/**
* @Description:字符串截取--拼接实现
* @param phone
* @return
* @return String
* @version v1.0
* @author wu
* @date 2022年4月13日 下午11:03:33
*/
static String hidePhone(String phone){
if(StringUtils.isNotBlank(phone) && phone.length() == 11){
// 截取前面三位
String start = phone.substring(0, 3);
// 中间填充四颗星 ****
String middle = "****";
// 截取末尾四位
String end = phone.substring(7, 11);
return start.concat(middle).concat(end);
}
return phone;
}
3、使用Hutool的PhoneUtil实现手机号码隐藏
( 2023年6月5日 16:15:55 )
/**
* Description: 使用Hutool的PhoneUtil实现手机号码隐藏
* @return void
* @version v1.0
* @author wu
* @date 2023/6/5 16:10
*/
@Test
public void hidePhoneByHutoolTest() throws Exception{
String s = "17600213668";
System.out.println("1-后四位隐藏 :"+PhoneUtil.hideAfter(s));
System.out.println("2-前七位隐藏 :"+PhoneUtil.hideBefore(s));
System.out.println("3-中间四位隐藏 :"+PhoneUtil.hideBetween(s));
s = "1760021366";
System.out.println("4-后四位隐藏 :"+PhoneUtil.hideAfter(s));
System.out.println("5-前七位隐藏 :"+PhoneUtil.hideBefore(s));
System.out.println("6-中间四位隐藏 :"+PhoneUtil.hideBetween(s));
s = "176002136689";
System.out.println("7-后四位隐藏 :"+PhoneUtil.hideAfter(s));
System.out.println("8-前七位隐藏 :"+PhoneUtil.hideBefore(s));
System.out.println("9-中间四位隐藏 :"+PhoneUtil.hideBetween(s));
}
三、MySQL实现
1、insert 函数,语法规则如下:
-- insert函数用法 INSERT(str,start,end,newstr)
/**
* str:源字符串
* start: 起始位置
* end: 结束位置
* newStr: 替换的字符串
*/
select
insert('13155667788',4,4,'****') as phone
, insert('13155667788',6,4,'****') as phone2
from dual ;
四、Oracle 实现
1、substr 函数 --- 和Java中类似
SELECT
STARTS , ends
, STARTS || '****' || ends AS res1
, CONCAT(STARTS,CONCAT('****',ENDS)) AS res2
FROM (
SELECT
SUBSTR('13155667788',0,3) AS Starts
, SUBSTR('13155667788',1,3) AS Starts2
, SUBSTR('13155667788',8,11) AS ends
FROM dual
)
五、总结
1、实现手机号隐藏的需求,从数据库层面和Java代码层面都是可以实现的; 实现原理类似:对字符串进行 截取、拼接。
2、Oracle中字符串拼接: || 和 concat 的区别是:
- || :可以不限次数拼接(理论上可以无限套娃)。 如:'a' ||'b'||'c' || ...
- concat : 只能拼接一次,多次拼接需要concat 函数嵌套使用。如: CONCAT('a',CONCAT('b',CONCAT('c',...)))
3、Oracle concat 函数和 MySQL concat 函数的区别是:同上【五-2】。
- Oracle concat 函数:拼接一次 ...
- MySQL concat 函数:理论上可以无限套娃 ...
4、可以根据实际情况,按需所取。