掩码 Phone 带括号和空格的数字 Java

Mask Phone number with brackets and spaces Java

我有一个 phone 号码屏蔽的方法。我需要用星星替换除最后 4 位以外的所有数字。 示例输入为:+91 (333) 444-5678+1(333) 456 -7890。输出应该是这样的:

但我的输出实际上是这样的:

所以这是我的代码:

public static String maskPhoneNumber(String inputPhoneNum){
        return inputPhoneNum.replaceAll("\(", "-")
                .replaceAll("\)", "-")
                .replaceAll(" ", "-")
                .replaceAll("\d(?=(?:\D*\d){4})", "*");
    }

我的方法适用于国家代码中不同位数的数字,但在数字之间不是 space 而是国家代码附近的括号(后面是三元组)的情况下,它会中断。 如果能提供一些关于如何改进我的方法的提示,我将不胜感激!

目前,您将每个 space、() 替换为 -。您需要用 1 个连字符替换所有连续出现的内容。

使用

public static String maskPhoneNumber(String inputPhoneNum){
    return inputPhoneNum.replaceAll("[()\s]+", "-")
            .replaceAll("\d(?=(?:\D*\d){4})", "*");
}

参见 this Java demo

+91 (333) 444-5678变成+**-***-***-5678+1(333) 456-7890变成+*-***-***-7890

[()\s]+ 模式匹配 1 个或多个 (+) 个连续的 () 或 whitespace 个字符。参见 the "normalization" step regex demo and the final step demo

语言本身有一个专用的 API(以 appendReplacement 的形式)

    String test = "+91 (333) 444-5678";
    test = test.replaceAll("[()\s]+", "-");
    Pattern p = Pattern.compile("\d+(?!\d*$)");
    Matcher m = p.matcher(test);

    StringBuilder sb = new StringBuilder(); // +**-***-***-5678

    for (; m.find();) {
        m.appendReplacement(sb, m.group().replaceAll(".", "*"));
    }

    m.appendTail(sb);

    System.out.println(sb.toString());