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

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

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

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

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

 hkid.replaceAll(regex, "*") 

请帮忙,谢谢。

杰西

就个人而言,我不会用正则表达式来做:

 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(或到达字符串的开头),它就会停止迭代,并构建一个新的字符串。

虽然我同意非正则表达式解决方案可能是最简单和最快的,但是如果存在分组,则这是一个独立的最后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” – > output =“A123 ****”
  • input =“A123456(7)” – > output =“A123 ***(*)”
  • input =“A12345(67)” – > output =“A123 **(**)”
  • input =“A1(234567)” – > output =“A1(23 ****)”
  • input =“A1234B567” – > output =“A123 * B ***”

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