Reputation: 3099
I need to mask the phone number. it may consist of the digits, + (for country code) and dashes. The country code may consist of 1 or more digits. I have created such kind of regular expression to mask all the digits except the last 4:
inputPhoneNum.replaceAll("\\d(?=\\d{4})", "*");
For such input: +13334445678
I get this result: +*******5678
However, it doesn't work for such input: +1-333-444-5678 In particular, it returns just the same number without any change. While the desired output is masking all the digits except for the last 4, plus sign and dashes. That is why I was wondering how I can change my regular expression to include dashes? I would be grateful for any help!
Upvotes: 11
Views: 26392
Reputation: 375
This is what I used, it may be useful, just masks some digits in the provided number
/*
* 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;
}
Upvotes: 0
Reputation: 4266
If you don't want to use regex
, an alternate solution would be to loop through the String
with a StringBuilder
from end to start, and append the first 4 digits and then *
after that (and just append any non-digit characters as normal)
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();
}
Upvotes: 0
Reputation: 785276
Use this regex for searching:
.(?=.{4})
Difference is that .
will match any character not just a digit as in your regex.
Java code:
inputPhoneNum = inputPhoneNum.replaceAll(".(?=.{4})", "*");
However if your intent is to mask all digits before last 4 digits then use:
.(?=(?:\D*\d){4})
Or in Java:
inputPhoneNum = inputPhoneNum.replaceAll("\\d(?=(?:\\D*\\d){4})", "*");
(?=(?:\\D*\\d){4})
is a positive lookahead that asserts presence of at least 4 digits ahead that may be separated by 0 or more non-digits.
Upvotes: 18
Reputation: 21
I think this should work
".*\\d(?=\\d{4})","*"
You can try creating by hit and trial using this website.
Upvotes: 0
Reputation: 59985
Try to use two replace all non digit or + with empty then use your regex :
"+1-333-444-5678".replaceAll("[^\\d\\+]", "").replaceAll("\\d(?=\\d{4})", "*");
Output
+*******5678
Upvotes: 2
Reputation: 1219
I'm not good in RegEx but I think you should normalize the phone numbers by getting rid of -
occurences :
inputPhoneNum = inputPhoneNum.replace("-","").replaceAll("\\d(?=\\d{4})", "*");
Upvotes: 2