【问题标题】:ReplaceAll with defined replacement number JavaReplaceAll 定义的替换编号 Java
【发布时间】:2017-11-22 23:12:50
【问题描述】:

我有一种电子邮件屏蔽方法。我需要用星号替换@ 之前电子邮件中的字母。但问题是总是应该有 5 颗星,并且不应该隐藏第一个和最后一个元素。 示例输入为:someemail@gmail.com。输出:s*****l@gmail.com 因此,电子邮件中第一个字符和最后一个字符之间的字符数无关紧要。这是我的代码:

public static String maskEmail(String inputEmail){
    return inputEmail.replaceAll("(?<=.).(?=[^@]*?.@)", "*");
}

我的方法掩盖了这封电子邮件,但问题是我不知道如何准确地打出 5 星。

【问题讨论】:

    标签: java regex string replaceall


    【解决方案1】:

    只取第一个字母并将其与五个星号和从@之前的字母开始的子字符串连接起来会简单得多:

    public static String maskEmail(String inputEmail) {
        return inputEmail.substring(0, 1) + 
               "*****" + 
               inputEmail.substring(inputEmail.indexOf('@') - 1);
    }
    

    【讨论】:

    • 比基于正则表达式的解决方案更易于阅读且更高效。 +1
    【解决方案2】:

    这个怎么样:

    inputEmail.replaceAll("(?<=^.).*(?=.@)", "*****")
    

    或者这个:

    inputEmail.replaceAll("(.).*(.@)", "$1*****$2")
    

    请注意,这仅在 @ 前至少有 2 个字符时才有效。

    【讨论】:

      【解决方案3】:

      试试这个代码:

      import java.util.Arrays;
      
      public class HelloWorld{
      
          public static String StrToAsterisk(String email){
              if (email == null) return "";
      
              int flag = email.indexOf("@");
              if (flag < 0) return "";
      
              StringBuilder sb = new StringBuilder();
              sb.append(email.charAt(0));
              sb.append("*****");
              sb.append(email.substring(flag-1));
              return sb.toString();
           }
      
           public static void main(String []args){
               System.out.println(StrToAsterisk("someemail@gmail.com"));
               //input : someemail@gmail.com
               //output: s*****l@gmail.com
           }
       }
      

      【讨论】:

      • OP 专门要求 5 星。
      猜你喜欢
      • 2012-09-21
      • 1970-01-01
      • 2012-12-18
      • 2019-01-13
      • 2016-07-06
      • 1970-01-01
      • 2012-11-21
      • 2021-03-28
      • 2019-01-01
      相关资源
      最近更新 更多