Java 用括号和空格屏蔽电话号码

Java 用括号和空格屏蔽电话号码,java,regex,replaceall,Java,Regex,Replaceall,我有一个电话号码屏蔽的方法。我需要用星星替换所有数字,最后4个除外。 样本输入为:+91(333)444-5678和+1(333)456-7890。输出应该是这样的: 但我的输出实际上是这样的: 这是我的代码: public static String maskPhoneNumber(String inputPhoneNum){ return inputPhoneNum.replaceAll("\\(", "-") .replaceAll("\

我有一个电话号码屏蔽的方法。我需要用星星替换所有数字,最后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})", "*");
    }
我的方法适用于国家代码中的不同位数,但如果国家代码附近有括号(后面有三元组),而不是数字之间的空格,则会出现中断。
如果您能给我一些提示,告诉我如何改进我的方法,我将不胜感激

目前,您将每个单独的空格,
替换为
-
。您需要用1个连字符替换所有连续出现的情况

使用

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


[()\s]+
模式匹配一个或多个(
+
)连续的
或空白字符。请参阅和。

语言本身有一个专门的API(以
附录替换的形式)


但如果没有国家代码,情况又如何呢?这是可能的。例如,对于(333)456-7890,这个正则表达式将在开头加一个破折号。@Cassie:456-7890的预期结果是什么<代码>***-***-7890
?检查一下,谢谢!这对我帮助很大。@Eugene如果你指的是
附件替换
,它已经过时了,是的,我们可以修改当前的OP解决方案以使用该方法,但它在这里并没有真正的帮助,可能会变得更“棘手”。请看,您的解决方案没有提供预期的结果。@Eugene我没有否决它,请注意,如果您想用1个正则表达式解决它,它将相当长,有一些替换和捕获组。可能一文不值。
public static String maskPhoneNumber(String inputPhoneNum){
    return inputPhoneNum.replaceAll("[()\\s]+", "-")
            .replaceAll("\\d(?=(?:\\D*\\d){4})", "*");
}
    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());