正则表达式替换表面

时间:2017-10-27 10:53:54

标签: java regex

我无法更换正则表达式

例如我有电子邮件

felipe@gmail.com

我要替换

f****e@g***l.com

我已经有了开始

(?<=.).(?=[^@]*?.@)|(?<=\@.).

在我测试的链接下面

REGEX

5 个答案:

答案 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)

我发现了这个:(?<=.)([^@])(?!@)(?=.*@)|(?<!@)([^@])(?!.*@)(?!\.)(?=.*\.)

Demo

答案 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, '*');
            }
        }

当然有些情况也不会起作用(即域中的@),而且代码有点混乱,但在某些阶段可能会有用。

Demo

答案 4 :(得分:1)

模式:

^(.)[^@]*([^@])@(.).*(.)\.([a-z]+)$

的更换:

\1***\2@\3***\4.\5

限制:不适用于单字符用户名和单字符域名,例如 I@home.com john@B.com