使用正则表达式来掩盖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]
匹配偶数只要。