[英]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();
}
正則表達式不是正確的工具(請參閱: 使用正則表達式來驗證電子郵件地址 )。 另一種方法是按照以下方式進行操作:
將您的消息分解成單詞( message.split("\\\\s+")
或類似的東西)。
對於每個單詞,通過InternetAddress
構造函數檢查它是否是電子郵件地址:
try { new InternetAddress(word, true); // valid e-mail address } catch (AddressException e) { // not an e-mail address }
如果單詞是電子郵件地址,請使用當前功能“保護”它。
將所有單詞重新合並為一條新消息,其中所有電子郵件地址均受到保護。
如果你真的想在另一方面使用正則表達式,然后......嗯...... 你自找的 。
我建議采用以下方法:
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.