用括号和空格隐藏电话号码 Java

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

enter image description here

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

enter image description here

以下是我的代码:
public static String maskPhoneNumber(String inputPhoneNum){
        return inputPhoneNum.replaceAll("\\(", "-")
                .replaceAll("\\)", "-")
                .replaceAll(" ", "-")
                .replaceAll("\\d(?=(?:\\D*\\d){4})", "*");
    }

我的方法适用于国家代码中不同数量的数字,但在国家代码之后的三位数旁边有括号的情况下会出错(而不是数字之间有空格)。 我希望能得到一些提示,以便改进我的方法!

2个回答

2

目前,您将每个单独的空格、()都替换为一个-。您需要将所有连续出现的空格和符号替换为1个连字符。

使用

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

请查看这个Java演示

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

[()\s]+模式匹配一个或多个(+)连续的()或空格字符。请参见“规范化”步骤正则表达式演示最终步骤演示


但是如果没有国家代码呢?这也是可能的情况。例如,对于(333)456-7890,这个正则表达式会在开头放一个破折号。 - Cassie
@Cassie:(333)456-7890的预期结果是什么?***-***-7890?请查看此更新的Java演示 - Wiktor Stribiżew
1
谢谢!它帮了我很多。 - Cassie
@Eugene 如果你指的是 appendReplacement,那它早已经存在了,我们可以重构当前的 OP 解决方案来使用这个方法,但在这里并没有真正帮助到我们,反而可能会变得更加“棘手”。你看,你的解决方案并没有提供预期的结果。 - Wiktor Stribiżew
@Eugene 我没有给它点踩,只是想提醒你,如果你想用一个正则表达式来解决它,那么它会相当冗长,需要一些替换和捕获组。可能不值得一试。 - Wiktor Stribiżew
@WiktorStribiżew 我绝对不想用单个正则表达式来完成它 - 只是想展示语言对此的支持,仅此而已。嘿,我甚至给了你的答案点赞。顺便感谢你的更正。 - Eugene

1
语言本身有一个专门的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());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接