您可以在一组中捕获首个零和紧随其后的3个字母数字字符,中间部分进入第二组,然后最后4个字母数字字符进入第三组,然后只替换第二组中的每个字符.
下面是一个示例(与Java 11兼容):
String text = "0001113033AA55608981";
Matcher mr = Pattern.compile("^(0*\\w{4})(.*)(\\w{4})$").matcher(text);
text = mr.replaceFirst(m -> m.group(1) + "*".repeat(m.group(2).length()) + m.group(3));
System.out.println(text); // => 0001113**********8981
看Java demo
正则表达式匹配
^
—字符串开始
(0*\w{4})
—组1:零个或多个0
字符,然后是任意四个数字/下划线字符
(.*)
—第2组:除行号字符以外的任何零个或多个字符(如果只允许"word"字符,则替换为\w*
)
(\w{4})
-第三组:四个"单词"字符
$
—字符串的结尾
Java 8兼容版本:
String text = "0001113033AA55608981";
Matcher m = Pattern.compile("^(0*\\w{4})(.*)(\\w{4})$").matcher(text);
StringBuffer result = new StringBuffer();
while (m.find()) {
m.appendReplacement(result, m.group(1) + String.join("", Collections.nCopies(m.group(2).length(), "*")) + m.group(3));
}
m.appendTail(result);
System.out.println(result.toString());
看Java code demo online
但你可以直接用
String text = "0001113033AA55608981";
Matcher m = Pattern.compile("^(0*\\w{4})(.*)(\\w{4})$").matcher(text);
String result = "";
if (m.matches()) {
result = m.group(1) + String.join("", Collections.nCopies(m.group(2).length(), "*")) + m.group(3);
}
System.out.println(result);