用Java替换字符串中的电子邮件

时间:2015-12-23 16:50:27

标签: java regex email

我需要保护文本中包含的电子邮件地址。理想情况下,找到一个可以更有效地完成它的正则表达式。

示例:

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;
}

基本上我需要的是一个很好的正则表达式。类似于this但与邮件的另一部分类似的东西,如果可能的话。

...谢谢

5 个答案:

答案 0 :(得分:4)

您可以使用(\\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:表示第3组(@.*)

答案 1 :(得分:2)

你可以使用类似的东西:

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

它应该替换1到4个({1,4})非空白字符(\\S),后跟@ ****@

所以它会以某种方式替换文本

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

答案 2 :(得分:0)

这是检查字符串是否有效的方法(是否是电子邮件)。 将文本拆分为单词,并使用此方法检查每个单词。如果是电子邮件,请将其替换为星号(*)。

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();
}

答案 3 :(得分:0)

正则表达式不是正确的工具(参见:Using a regular expression to validate an email address)。另一种方法是沿着这些方向做点什么:

  1. 将您的信息拆分为单词(message.split("\\s+")或其他类似内容)。

  2. 对于每个单词,通过InternetAddress构造函数检查它是否是电子邮件地址:

    try {
        new InternetAddress(word, true);
        // valid e-mail address
    } catch (AddressException e) {
        // not an e-mail address
    }
    
  3. 如果一个单词是一个电子邮件地址,&#34;保护&#34;它使用你当前的功能。

  4. 将所有字词重新加入新邮箱,其中电子邮件地址全部受到保护。

  5. 如果你真的想在另一方面使用正则表达式,那么......好吧...... you asked for it

答案 4 :(得分:0)

我建议采用以下方法:

+