簡體   English   中英

在java中屏蔽電子郵件地址

[英]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.comabc@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM