java用replace方法替换身份证号的中间位数

我在用replace方法替换身份证的中间几位,

 String uAccount = userAccount.replace(userAccount.substring(6, 14), "********");

这样的方法当身份证号码是622222222222222222这样的时候,替换出来成6****************2这样了,难道不应该是622222********2222的吗,但是如果身份证号码没有重复这么多的话它出来是合适的,比如622420********1478这样,这是为什么呢,求大神指点!

StringBuilder sb = new StringBuilder(userAccount);
sb.replace(6, 14, "********");
userAccount=sb.toString();

一般都是substring()出来一段 去替换 如果还是担心有重复的话 可以tochararray()之后重新拼接把指定的位拼成* 就ok了

因为你截取的第7到15位之间的字符串就是“22222222”。是8个2,那么,你给的字符串中恰巧有17个连续的2,其中有两个连续的“22222222”,然后剩下一个2了。明白了没?

你通过userAccount.substring(6, 14), 截取出来是“22222222”,替换的时候当然就把所有的匹配项都替换掉了。你可以使用截取再拼接的方法。

userAccount.substring(6, 14) 你截取的得到的是 222222, 替换的时候是拿你截取的222222这串字符串进行匹配, 所有替换后就会是6****1278了,

你可以先截取0-6的缓存起来 然后截取14-end的缓存,再进行替换

String str1 =userAccount.substring(0, 6) ;
String str2 =userAccount.substring(14, userAccount.length()) ;

String result = str1 + "******"+str2;

userAccount.substring(0,6)+"********"+userAccount.substring(userAccount.length()-4,userAccount.length());
    public static void main(String[] args) {
    String id = "110110199001011010";
    System.out.println(id.length());
    String substring = id.substring(6,14);
    System.out.println(substring);
    String replace = id.replace(substring, "********");
    System.out.println(replace);
    char[] charArray = id.toCharArray();
    String newid = "";
    for (int i = 0; i < charArray.length; i++) {
        if (i <= 5 || i >= 14) {
            newid += charArray[i];
        }else {
            newid += "*";
        }
    }
    System.out.println(newid);
}

String uAccount = userAccount.substring(0, 6) + "********" + userAccount.substring(14);

是你的写法有问题,String uAccount = userAccount.replace(, "********") 相当于String uAccount = userAccoun.replace
("22222222","********")。 userAccount.substring(6, 14)这个是单独计算出来的,跟外面层的 userAccount已经没关系了。

统一回复:感谢大家 解决了 非常感谢 渌江小鲤鱼 和 weixin_316529 ,两个方法都没问题,因为weixin_316529 他的改动较少,采纳了 再次感谢!!!

而且replace就是一个全局匹配的方法,不能按你那种写法来写,只能用substring的方式进行截取拼接。

楼主的意图因为是想着前后各四位不匹配,不管身份证多少位?如果是这样的话,请使用正则表达式

replace是方法是全部匹配的方法,只要满足,就会匹配修改的,一个数字,可能对多次满足这个匹配的条件


js: "1234afafasdas4321".replace(/^([\d]{4,4}).*?([\d]{4,4})$/g,'$1****$2')

图片说明


java: 

String a =  "1234afafasdas4321";
a.replace("^([\\d]{4,4}).*?([\\d]{4,4})$" ,"$1***$2");