[英]masking of email address in java
我試圖用“*”掩蓋電子郵件地址,但我在正則表達式上表現不佳。
input : nileshxyzae@gmail.com
output : nil********@gmail.com
我的代碼是
String maskedEmail = email.replaceAll("(?<=.{3}).(?=[^@]*?.@)", "*");
但它給我的輸出nil*******e@gmail.com
我不知道這里出了什么問題。 為什么最后一個角色沒有轉換? 也有人可以解釋所有這些正則表達式的含義
你的預測(?=[^@]*?.@)
要求@
前面至少有一個字符(見@
之前的點)。
如果刪除它,您將獲得所有預期的符號替換:
(?<=.{3}).(?=[^@]*?@)
這是正則表達式演示 (替換為*
)。
但是,正則表達式不是該任務的正確正則表達式。 你需要一個正則表達式,它匹配前3個字符后的每個字符,直到第一個@
:
(^[^@]{3}|(?!^)\G)[^@]
查看另一個正則表達式演示 ,替換為$1*
。 這里, [^@]
匹配任何非@
字符,因此我們不匹配abc@example.com
等abc@example.com
。 只有那些在用戶名部分中有4個以上字符的電子郵件才會被屏蔽。
請參閱IDEONE演示 :
String s = "nileshkemse@gmail.com";
System.out.println(s.replaceAll("(^[^@]{3}|(?!^)\\G)[^@]", "$1*"));
如果你對正則表達式不好,不要使用它們:)我不知道你是否聽過這句話:
有些人在面對問題時會想“我知道,我會使用正則表達式”。 現在他們有兩個問題。
( 來源 )
你可能會在這里獲得正常的表達式,但今天你能理解它嗎? 明天? 在六個月的時間? 你的同事會嗎?
一個簡單的替代方法是使用StringBuilder
,我認為理解這里發生的事情要簡單得多:
StringBuilder sb = new StringBuilder(email);
for (int i = 3; i < sb.length() && sb.charAt(i) != '@'; ++i) {
sb.setCharAt(i, '*');
}
email = sb.toString();
“從第三個字符開始,用*
替換字符,直到到達字符串的末尾或@
。”
(你甚至不需要使用StringBuilder
:你可以簡單地操作email.toCharArray()
的元素,然后在最后構造一個新的字符串)。
當然,對於本地部分短於3個字符的電子郵件地址,這不能正常工作 - 實際上它會掩蓋域。
你的前瞻有點復雜。 試試這段代碼:
public static void main(String... args) throws Exception {
String s = "nileshkemse@gmail.com";
s= s.replaceAll("(?<=.{3}).(?=.*@)", "*");
System.out.println(s);
}
O / P:
nil********@gmail.com
我喜歡這個,因為我只想隱藏4個字符,如果電子郵件地址太短,它還會動態地將隱藏的字符減少到2:
public static String maskEmailAddress(final String email) {
final String mask = "*****";
final int at = email.indexOf("@");
if (at > 2) {
final int maskLen = Math.min(Math.max(at / 2, 2), 4);
final int start = (at - maskLen) / 2;
return email.substring(0, start) + mask.substring(0, maskLen) + email.substring(start + maskLen);
}
return email;
}
樣本輸出:
my.email@gmail.com > my****il@gmail.com
info@mail.com > i**o@mail.com
//In Kotlin
val email = "nileshkemse@gmail.com"
val maskedEmail = email.replace(Regex("(?<=.{3}).(?=.*@)"), "*")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.