我想掩盖身份证号码的最后4位数字(hkid) A123456(7) - > A123 ***(*)
我可以通过以下方式做到这一点:
hkid.replaceAll("\\d{3}\\(\\d\\)", "***(*)")
但是,我的正则表达式是否真的可以匹配最后4位数并替换为“*”?
hkid.replaceAll(regex, "*")
请帮助,谢谢。
杰西
答案 0 :(得分:2)
就个人而言,我不会用正则表达式来做这件事:
char[] cs = hkid.toCharArray();
for (int i = cs.length - 1, d = 0; i >= 0 && d < 4; --i) {
if (Character.isDigit(cs[i])) {
cs[i] = '*';
++d;
}
}
String masked = new String(cs);
这是从字符串的末尾开始,查找数字字符,它替换为*
。一旦找到4(或到达字符串的开头),它就会停止迭代,并构建一个新的字符串。
答案 1 :(得分:2)
虽然我同意非正则表达式解决方案可能是最简单和最快的,但是如果有一个分组,那么这是一个独立的最后4位数的正则表达式:\d(?=(?:\D*\d){0,3}\D*$)
此表达式用于匹配在输入结束之前后跟0到3位的任何数字。
表达式的简短分类:
\d
匹配单个数字\D
匹配单个非数字(?=...)
是一个积极的前瞻,有助于比赛,但不会消耗(?:...){0,3}
是一个非捕获组,其数量为0到3次。$
匹配输入的结尾所以你可以按如下方式阅读表达式:“匹配一个数字,如果它跟随一个0到3倍的任意数字的非数字的序列,后跟一个数字,并且该序列后跟任何数字非数字和输入的结尾“(听起来很复杂,没有?)。
使用input.replaceAll( "\\d(?=(?:\\D*\\d){0,3}\\D*$)", "*" )
时的一些结果:
正如您在上一个示例中所看到的,表达式仅匹配数字。如果您想匹配字母,请将\d
和\D
替换为\w
和\W
(请注意,\w
也会匹配下划线)或使用自定义字符课程,例如[02468]
和[^02468]
仅匹配偶数。