我需要屏蔽电话号码。 它可以由数字+(用于国家/地区代码(和短划线组成。国家/地区代码可以由 1 位或多位数字组成。我创建了这种正则表达式来掩盖除最后 4 个数字之外的所有数字:
inputPhoneNum.replaceAll("\d(?=\d{4})", "*");
对于此类输入:+13334445678
我得到这个结果: +********5678
但是,它不适用于此类输入:+1-333-444-5678特别是,它只返回相同的数字,没有任何变化。而所需的输出会屏蔽除最后 4 位以外的所有数字,加上符号和破折号。这就是为什么我想知道如何更改我的正则表达式以包含破折号?我将不胜感激任何帮助!
使用此正则表达式进行搜索:
.(?=.{4})
正则表达式演示
不同之处在于.
将匹配任何字符,而不仅仅是正则表达式中的数字。
爪哇代码:
inputPhoneNum = inputPhoneNum.replaceAll(".(?=.{4})", "*");
但是,如果您的目的是屏蔽最后 4 位数字之前的所有数字,请使用:
.(?=(?:D*d){4})
或者在爪哇中:
inputPhoneNum = inputPhoneNum.replaceAll("\d(?=(?:\D*\d){4})", "*");
(?=(?:\D*\d){4})
是一个积极的前瞻,断言前面至少存在 4 位数字,这些数字可能由 0 或多个非数字分隔。
正则表达式演示 2
我不擅长正则表达式,但我认为您应该通过摆脱-
来规范电话号码:
inputPhoneNum = inputPhoneNum.replace("-","").replaceAll("\d(?=\d{4})", "*");
尝试使用两个将所有非数字或 + 替换为空,然后使用您的正则表达式:
"+1-333-444-5678".replaceAll("[^\d\+]", "").replaceAll("\d(?=\d{4})", "*");
输出
+*******5678
我认为这应该有效
".*\d(?=\d{4})","*"
您可以尝试使用此网站通过点击和试用进行创建。
如果您不想使用 regex
,另一种解决方案是用StringBuilder
从头到尾循环遍历String
,并附加前 4 位数字,然后*
(并像往常一样附加任何非数字字符(
public static String lastFour(String s) {
StringBuilder lastFour = new StringBuilder();
int check = 0;
for (int i = s.length() - 1; i >= 0; i--) {
if (Character.isDigit(s.charAt(i))) {
check++;
}
if (check <= 4) {
lastFour.append(s.charAt(i));
} else {
lastFour.append(Character.isDigit(s.charAt(i)) ? "*" : s.charAt(i));
}
}
return lastFour.reverse().toString();
}
在线试用!
这是我使用的,它可能很有用,只是屏蔽了提供的数字中的一些数字
/*
* mask mobile number .
*/
public String maskMobileNumber(String mobile) {
final String mask = "*******";
mobile = mobile == null ? mask : mobile;
final int lengthOfMobileNumber = mobile.length();
if (lengthOfMobileNumber > 2) {
final int maskLen = Math.min(Math.max(lengthOfMobileNumber / 2, 2), 6);
final int start = (lengthOfMobileNumber - maskLen) / 2;
return mobile.substring(0, start) + mask.substring(0, maskLen) + mobile.substring(start + maskLen);
}
return mobile;
}