java中电子邮件地址的屏蔽
我试图用“*”来屏蔽电子邮件地址,但我不擅长正则表达式java中电子邮件地址的屏蔽,java,regex,Java,Regex,我试图用“*”来屏蔽电子邮件地址,但我不擅长正则表达式 input : nileshxyzae@gmail.com output : nil********@gmail.com 我的代码是 String maskedEmail = email.replaceAll("(?<=.{3}).(?=[^@]*?.@)", "*"); String maskedEmail=email.replaceAll((?您的前瞻性有点复杂。请尝试以下代码: public static void main
input : nileshxyzae@gmail.com
output : nil********@gmail.com
我的代码是
String maskedEmail = email.replaceAll("(?<=.{3}).(?=[^@]*?.@)", "*");
String maskedEmail=email.replaceAll((?您的前瞻性有点复杂。请尝试以下代码:
public static void main(String... args) throws Exception {
String s = "nileshkemse@gmail.com";
s= s.replaceAll("(?<=.{3}).(?=.*@)", "*");
System.out.println(s);
}
如果你不擅长正则表达式,就不要使用它们:)我不知道你是否听说过这句话:
有些人在遇到问题时会想
“我知道,我会使用正则表达式。”现在他们有两个问题
()
你可能会在这里得到一个有效的正则表达式,但你今天能理解它吗?明天?六个月后?你的同事能理解吗
一个简单的替代方法是使用StringBuilder
,我认为理解这里发生的事情要简单得多:
StringBuilder sb = new StringBuilder(email);
for (int i = 3; i < sb.length() && sb.charAt(i) != '@'; ++i) {
sb.setCharAt(i, '*');
}
email = sb.toString();
StringBuilder sb=新的StringBuilder(电子邮件);
对于(int i=3;i
从第三个字符开始,用*
替换字符,直到到达字符串末尾或@
(您甚至不需要使用StringBuilder
:您只需操作email.tocharray()
的元素,然后在末尾构造一个新字符串)
当然,这对于本地部分短于3个字符的电子邮件地址是不正确的-它实际上会屏蔽域。您的前瞻(?=[^@]*?。@
要求@
前面至少有1个字符(请参见@
前面的点)
如果将其删除,将替换所有预期符号:
(?<=.{3}).(?=[^@]*?@)
请参见,替换为$1*
。此处,[^@]
匹配任何非@
的字符,因此我们不匹配abc@example.com
。只有用户名部分包含4个以上字符的电子邮件才会被屏蔽
见:
我喜欢这个,因为我只想隐藏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
//在Kotlin中
val电子邮件=”nileshkemse@gmail.com"
Valas-MaskDeMeLe=电子邮件(替换)(ReXEX)(?这是你的真实电子邮件地址吗?如果是的话,你可能想考虑改变它……第二正则表达式可以简化为<代码>(^ [^ @ ] { 3 }(?!^)\g)/代码> @ nHAHTDH:或<代码>(^ [^ @ ] { 3 }((?)^)g)[^ @ ](?=[^ @ ] *@)
。有趣的是,删除前瞻后,完成匹配的步骤数增加。您需要选中复选框“禁用内部引擎优化”在调试器中。执行此操作后,对于失败的情况,它们的步骤数相同,而在成功的情况下,没有前瞻的情况下步骤数较少。在Java中,没有针对具有前瞻的情况进行优化。感谢您提醒有关如何使用regex101更好地调试Java regex的提示:)也许可以使用所有格量词来克服这个缺点,但我同意删除它是一种有效的方法。我想跳过@
之前的一个字符,我使用(?为什么\w
而不是简单的
?这导致了“foo”。bar@gmail.com“->”foo*bar@gmail.com而不是“foo****@gmail.com”@xehpuk-Ya。没有考虑过这种情况。现在更改了我的代码。谢谢。虽然您的代码可能会提供问题的答案,但请添加上下文,以便其他人了解它的作用和原因。感谢您的建议。在java中,我们有replaceAll,但在kotlin中我们没有。它是为kotlin learning user.ho发布的用同样的方法屏蔽gmail吗way@VanyaRachel-你知道怎么做了吗?你可以用if块做一个函数,这次使用:domain=email.substring(0,at+1)和at
作为域的长度。我没有添加到答案中,因为我想保持它的简单和简短。
String s = "nileshkemse@gmail.com";
System.out.println(s.replaceAll("(^[^@]{3}|(?!^)\\G)[^@]", "$1*"));
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}).(?=.*@)"), "*")
public static string GetMaskedEmail(string emailAddress)
{
string _emailToMask = emailAddress;
try
{
if (!string.IsNullOrEmpty(emailAddress))
{
var _splitEmail = emailAddress.Split(Char.Parse("@"));
var _user = _splitEmail[0];
var _domain = _splitEmail[1];
if (_user.Length > 3)
{
var _maskedUser = _user.Substring(0, 3) + new String(Char.Parse("*"), _user.Length - 3);
_emailToMask = _maskedUser + "@" + _domain;
}
else
{
_emailToMask = new String(Char.Parse("*"), _user.Length) + "@" + _domain;
}
}
}
catch (Exception) { }
return _emailToMask;
}