`

用正则表达式替换手机号为星号*的写法

阅读更多

现在网络越来越关注一些隐私,比如手机号隐藏当中的若干位数字,或隐藏身份证,银行卡号当中的若干长度为星号

 

对于一些固定长度的内容转换其实都挺方便的,但对于一些非定长的内容想保留固定尾部内容或者头部内容的话就比较麻烦了。

这两天发现很多朋友都不会写这个正则表达式,这里拿出来分享下

 

比如手机号只显示头尾的各3个数字,最简单的做法就是截取头部三个数字和尾部三个数字,然后当中插入5个星号就可以

这种做法显得比较笨拙,当然效率可能高一些,不过缺乏灵活性,比如人名显示姓,名字换成对应的*,那人名长度现在一般在2-4个字,具体后面跟多少个星号*,根据人数迭代啥的就麻烦点了

 

如果使用正则的话,就比较灵活,代码也比较简单。

假设对一串数字,保留头尾各3个数字,当中全部替换成*的话,代码如下:

String mobile = "13123456789";
String outMobile = mobile.replaceAll("(?<=\\d{3})\\d(?=\\d{3})", "*");
System.out.println(outMobile);

正则表达式的意思是,把所有前面有3个数字,后面有3个数字的数字换成*,那么于是从字符串中的2开始到7均在这个条件范围内,所以就全部替换了。

 

其他的可以根据这个灵活变换,当然如果反复这么调用的话,性能不是很高,所以建议参考replaceAll的源码,先生成Pattern对象,然后直接调用pattern.matcher(mobile).replaceAll("*");来操作,这样可以节省对象创建的内存及性能方面的消耗

 

分享到:
评论
1 楼 sunshine_bean 2015-03-20  
今天才知道这个用法叫做“零宽断言”。
(?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。
(?<=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp。

相关推荐

Global site tag (gtag.js) - Google Analytics