使用正则表达式来掩盖Java中的最后4位数

时间:2016-09-30 09:55:44

标签: java regex

我想掩盖身份证号码的最后4位数字(hkid) A123456(7) - > A123 ***(*)

我可以通过以下方式做到这一点:

hkid.replaceAll("\\d{3}\\(\\d\\)", "***(*)")

但是,我的正则表达式是否真的可以匹配最后4位数并替换为“*”?

hkid.replaceAll(regex, "*")

请帮助,谢谢。

杰西

2 个答案:

答案 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*$)", "*" )时的一些结果:

  • input =“A1234567” - &gt; output =“A123 ****”
  • input =“A123456(7)” - &gt; output =“A123 ***(*)”
  • input =“A12345(67)” - &gt; output =“A123 **(**)”
  • input =“A1(234567)” - &gt; output =“A1(23 ****)”
  • input =“A1234B567” - &gt; output =“A123 * B ***”

正如您在上一个示例中所看到的,表达式仅匹配数字。如果您想匹配字母,请将\d\D替换为\w\W(请注意,\w也会匹配下划线)或使用自定义字符课程,例如[02468][^02468]仅匹配偶数。