【问题标题】:Masking phone number Java屏蔽电话号码 Java
【发布时间】:2018-05-04 16:40:37
【问题描述】:

我需要屏蔽电话号码。它可能由数字、+(国家代码)和破折号组成。国家代码可以由 1 个或多个数字组成。我创建了这样的正则表达式来屏蔽除最后 4 位以外的所有数字:

inputPhoneNum.replaceAll("\\d(?=\\d{4})", "*");

对于此类输入:+13334445678

我得到这个结果:+*******5678

但是,它不适用于这样的输入:+1-333-444-5678 特别是,它只返回相同的数字而没有任何变化。虽然所需的输出屏蔽了除最后 4 位、加号和破折号之外的所有数字。 这就是为什么我想知道如何更改正则表达式以包含破折号?如果有任何帮助,我将不胜感激!

【问题讨论】:

  • 第二个数字的预期输出是+*-***-***-5678吗?
  • +1-23-45-67 是不是应该考虑的情况,如果是,应该如何屏蔽?
  • 检查此解决方案将对您有所帮助。 stackoverflow.com/questions/34675260/…
  • 我的意思是.replaceAll("\\d(?=(?:\\D*\\d){4})", "*"),但不知道这是否是您真正需要的。
  • @SebastianProske 这种情况不应考虑。大意是结尾有***-****这样的数字和国家代码开头的可能不同

标签: java regex masking


【解决方案1】:

使用此正则表达式进行搜索:

.(?=.{4})

RegEx Demo

不同之处在于. 将匹配任何字符,而不仅仅是正则表达式中的数字。

Java 代码:

inputPhoneNum = inputPhoneNum.replaceAll(".(?=.{4})", "*");

但是,如果您的意图是屏蔽 最后 4 位之前的所有数字,请使用:

.(?=(?:\D*\d){4})

或者在 Java 中:

inputPhoneNum = inputPhoneNum.replaceAll("\\d(?=(?:\\D*\\d){4})", "*");

(?=(?:\\D*\\d){4}) 是一个正向前瞻,它断言前面至少存在 4 个数字,这些数字可能被 0 个或多个非数字分隔。

RegEx Demo 2

【讨论】:

  • 所以123-465-789 将屏蔽除-789 之外的所有内容,而不是“除最后 4 位以外的所有数字
  • 我不知道每种电话格式,但它可能在某处有效;)这里我们有一个像0123-45-67-89 这样的格式。
  • 您仍在屏蔽数字中的初始 + 和所有 -(尽管 OP 没有为此指定正确的行为)。
  • 是的,因为 OP 写道:While the desired output is masking all the digits except for the last 4, plus sign and dashes
  • 我喜欢这个解决方案,即使你刚才说+- 和最后 4 位数字应该仍然可见;)但我仍然喜欢这个解决方案。 (只需将. 替换为\d 即可满足该要求)
【解决方案2】:

我不擅长 RegEx,但我认为您应该通过摆脱 -occurences 来规范电话号码:

   inputPhoneNum = inputPhoneNum.replace("-","").replaceAll("\\d(?=\\d{4})", "*");

【讨论】:

  • 您可以在没有正则表达式的情况下删除连字符,.replaceAll("\\-","") => .replace("-","")。顺便说一句,在字符类之外时,无需在正则表达式中转义 -
  • @mustabelMo 不是真的,不使用Regex 更简单/更快。
【解决方案3】:

尝试使用两个替换所有非数字或 + 为空,然后使用您的正则表达式:

"+1-333-444-5678".replaceAll("[^\\d\\+]", "").replaceAll("\\d(?=\\d{4})", "*");

输出

+*******5678

【讨论】:

    【解决方案4】:

    我认为这应该可行

    ".*\\d(?=\\d{4})","*"
    

    您可以使用this website尝试通过点击和试用创建。

    【讨论】:

      【解决方案5】:

      如果您不想使用 regex,另一种解决方案是使用 StringBuilder 从头到尾循环遍历 String,并附加前 4 位数字然后 * 之后(并且像往常一样添加任何非数字字符)

      public static String lastFour(String s) {
              StringBuilder lastFour = new StringBuilder();
              int check = 0;
              for (int i = s.length() - 1; i >= 0; i--) {
                  if (Character.isDigit(s.charAt(i))) {
                      check++;
                  }
                  if (check <= 4) {
                      lastFour.append(s.charAt(i));
                  } else {
                      lastFour.append(Character.isDigit(s.charAt(i)) ? "*" : s.charAt(i));
                  }
              }
              return lastFour.reverse().toString();
          }
      

      Try it online!

      【讨论】:

        【解决方案6】:

        这是我用的,它可能有用,只是掩盖了提供的数字中的一些数字

         /*
         * mask mobile number .
         */
        public  String maskMobileNumber(String mobile) {
            final String mask = "*******";
            mobile = mobile == null ? mask : mobile;
            final int lengthOfMobileNumber = mobile.length();
            if (lengthOfMobileNumber > 2) {
                final int maskLen = Math.min(Math.max(lengthOfMobileNumber / 2, 2), 6);
                final int start = (lengthOfMobileNumber - maskLen) / 2;
                return mobile.substring(0, start) + mask.substring(0, maskLen) + mobile.substring(start + maskLen);
            }
            return mobile;
        }
        

        【讨论】:

          猜你喜欢
          • 2018-05-07
          • 2012-07-24
          • 2022-01-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-30
          • 1970-01-01
          相关资源
          最近更新 更多