簡體   English   中英

用Java替換字符串中的電子郵件

[英]Replace emails in string in Java

我需要保護文本中包含的電子郵件地址。 理想情況下,找到可以更有效地執行此操作的正則表達式。

例:

Hi:

My Name is Alex and my mail is alexmail@domain.com but you can reply to
alexreply@other.domain.com.

所需的輸出:

Hi:

My Name is Alex and my mail is ale****@domain.com but you can reply to
ale****@other.domain.com.

邏輯是:保留前3個字符,並用*替換其余的字符,直到@。

a@mail.com     => a****@mail.com
ab@mail.com    => ab****@mail.com
abc@mail.com   => abc****@mail.com
abcd@mail.com  => abc****@mail.com
abcde@mail.com => abc****@mail.com

現在,我創建了一個以這種方式保護郵件的功能,但是當它是包含多個電子郵件的文本時,則不能使用replaceAll

public static String protectEmailAddress(String emailAddress) {
     String[] split = emailAddress.split("@");
     if (split[0].length() >= 3) {
         split[0] = split[0].substring(0, 3);  
     }
     emailAddress = StringUtils.join(split, "****@");

     return emailAddress;
}

因此,基本上我需要的是一個可以正常工作的正則表達式。 類似,但如果可能的話,還有郵件的另一部分。

謝謝...

您可以使用(\\\\w{1,3})(\\\\w+)(@.*)

String str = "alexreply@other.domain.com";
str = str.replaceAll("(\\w{1,3})(\\w+)(@.*)", "$1****$3");
System.out.println(str);

輸出值

ale****@other.domain.com

說明:

  • (\\\\w{1,3}) :匹配1至3個單詞字符
  • (\\\\w+) :匹配一個或多個單詞字符
  • (@.*) :匹配(含)之后的任何內容@
  • $1 :表示第一組是(\\\\w{1,3})
  • $3 :表示第三個組(@.*)

您可能會使用類似:

text = text.replaceAll("\\S{1,4}@","****@");

它應將1到4( {1,4} )個非空白字符( \\\\S )替換為@ ,然后將其替換為****@

因此它將以某種方式替換文本

a@          -> ****@
ab@         -> ****@
abc@        -> ****@
abcd@       -> ****@
abcde@      -> a****@
abcdef@     -> ab****@

這是檢查字符串有效性的方法(是否通過電子郵件發送)。 將您的文本拆分成單詞,然后使用此方法檢查每個單詞。 如果是電子郵件,請用星號(*)替換。

public static boolean isValidEmail(String str) {
    String pattern = "^[\\w!#$%&’*+/=?`{|}~^-]+(?:\\.[\\w!#$%&’*+/=?`{|}~^-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}$";
    Pattern p = Pattern.compile(pattern);
    Matcher m = p.matcher(str);
    return m.matches();
}

正則表達式不是正確的工具(請參閱: 使用正則表達式來驗證電子郵件地址 )。 另一種方法是按照以下方式進行操作:

  1. 將您的消息分解成單詞( message.split("\\\\s+")或類似的東西)。

  2. 對於每個單詞,通過InternetAddress構造函數檢查它是否是電子郵件地址:

     try { new InternetAddress(word, true); // valid e-mail address } catch (AddressException e) { // not an e-mail address } 
  3. 如果單詞是電子郵件地址,請使用當前功能“保護”它。

  4. 將所有單詞重新合並為一條新消息,其中所有電子郵件地址均受到保護。


如果你真的想在另一方面使用正則表達式,然后......嗯...... 你自找的

我建議采用以下方法:

public static void main(String[] args) {
        String text = "Hi:"
                + " "
                + "My Name is Alex and my mail is alexmail@domain.com but you can reply to "
                + "alexreply@other.domain.com."
                + " a@mail.com"
                + " abcd@mail.com";

        String emailPattern = "[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*"
                + "      @[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})";

        emailPattern = "(?<emailHead>[_A-Za-z0-9-\\+]{1,3})+?(?<replacementEmailPart>[_A-Za-z0-9-\\+]*)*?(?<emailTail>@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})){1}";

        Pattern p = Pattern.compile(emailPattern);

        Matcher m = p.matcher(text);

        StringBuffer sb = new StringBuffer();
        while (m.find()) {
            String replStr = m.group("replacementEmailPart");
            if (replStr != null) {
                replStr = replStr.replaceAll("[_A-Za-z0-9-\\+]", "*");
            } else {
                replStr = "****";
            }
            m.appendReplacement(sb, m.group("emailHead")
                    + replStr
                    + m.group("emailTail"));
        }
        m.appendTail(sb);
        System.out.println(sb.toString());
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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