我无法更换正则表达式
例如我有电子邮件
felipe@gmail.com
我要替换
f****e@g***l.com
我已经有了开始
(?<=.).(?=[^@]*?.@)|(?<=\@.).
在我测试的链接下面
答案 0 :(得分:5)
通过对模式进行进一步调整,您可以实现:
"felipe@gmail.com".replaceAll("(?<=[^@])[^@](?=[^@]*?.[@.])", "*");
这将为您提供f****e@g***l.com
。
可能更高效,更易读的解决方案可能是找到@
和.
的索引,
并将来自子串的期望结果汇总在一起:
int atIndex = email.indexOf('@');
int dotIndex = email.indexOf('.');
if (atIndex > 2 && dotIndex > atIndex + 2) {
String masked = email.charAt(0)
+ email.substring(1, atIndex - 1).replaceAll(".", "*")
+ email.substring(atIndex - 1, atIndex + 2)
+ email.substring(atIndex + 2, dotIndex - 1).replaceAll(".", "*")
+ email.substring(dotIndex - 1);
System.out.println(masked);
}
答案 1 :(得分:3)
我发现了这个:(?<=.)([^@])(?!@)(?=.*@)|(?<!@)([^@])(?!.*@)(?!\.)(?=.*\.)
答案 2 :(得分:2)
你可以使用这样的模式:
String str = "felipe@gmail.com";
String regex = "(.)(.*?)(.@.)(.*?)(.\\..*)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
String result = "";
if (matcher.find()) {
result = matcher.group(1) + matcher.group(2).replaceAll(".", "*")
+ matcher.group(3) + matcher.group(4).replaceAll(".", "*")
+ matcher.group(5);
}
System.out.println(result);// output = f****e@g***l.com
答案 3 :(得分:1)
另一种方法是使用StringBuilder
并完全避免使用正则表达式。
如果电子邮件名称中有@
,或者域名类似于.co.uk
所以这可能有助于这些情况:
String email = "felipe@gmail.com";
StringBuilder sb = new StringBuilder(email);
int mp = sb.lastIndexOf("@");
int dp = sb.substring(mp).indexOf(".");
for (int i = 1; i < sb.length(); i++) {
if (i != mp && i != mp - 1 && i != mp + 1 && i != ((mp + dp) - 1) && i < (dp + mp)) {
sb.setCharAt(i, '*');
}
}
当然有些情况也不会起作用(即域中的@
),而且代码有点混乱,但在某些阶段可能会有用。
答案 4 :(得分:1)
模式:
^(.)[^@]*([^@])@(.).*(.)\.([a-z]+)$
的更换:
\1***\2@\3***\4.\5
限制:不适用于单字符用户名和单字符域名,例如 I@home.com 或 john@B.com 。