public static void main(String[] args) {
String str = "测试替换手机号15212793109哇哈哈18909801234欧米茄";
System.out.println("<<<替换前:"+str);
str = hideAllPhoneNum(str);
System.out.println("<<<替换后:"+str);
}
/**
* 隐藏并替换字符串中所有的手机号
* @param contentStr
* @return
*/
public static String hideAllPhoneNum(String contentStr){
Pattern pattern =Pattern.compile("((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}");
Matcher matcher = pattern.matcher(contentStr);
StringBuffer sb = new StringBuffer();
try {
while(matcher.find()) {
String phoneStr = matcher.group();
phoneStr = phoneStr.substring(0, 3) + "****" + phoneStr.substring(7, phoneStr.length());
matcher.appendReplacement(sb,phoneStr);
}
System.out.println("执行appendTail前:"+sb.toString());
matcher.appendTail(sb);
System.out.println("执行appendTail后:"+sb.toString());
} catch (Exception ex) {
ex.printStackTrace();
}
return sb.toString();
}
运行结果:
appendReplacement方法:sb是一个StringBuffer,replaceContext待替换的字符串,这个方法会把匹配到的内容替换为replaceContext,并且把从上次替换的位置到这次替换位置之间的字符串也拿到,然后,加上这次替换后的结果一起追加到StringBuffer里(假如这次替换是第一次替换,那就是只追加替换后的字符串啦)。
appendTail方法:sb是一个StringBuffer,这个方法是把最后一次匹配到内容之后的字符串追加到StringBuffer中。
两个方法一起使用就可以达到所有替换或者替换第一个:
所有替换:
- while(m.find()){
- m.appendReplacement(sb,replaceContext);
- }
- .appendTail(sb);
- if (matcher.find()){
- matcher.appendReplacement(sb, replaceContext);
- }
- matcher.appendTail(sb);