首页 > 解决方案 > 用正则表达式打印Java中的第二个字符和最后四个字符的屏蔽电话号码

问题描述

我正在尝试使用正则表达式来打印字符串的第二个字符和最后四个字符。

这是我拥有的正则表达式,它只打印 + 和字符串的最后四个:

s.replaceAll("\\w(?=\\w{4})", "*");

我正在使用:“+13334445678”作为测试虚拟数据。

我希望它是:+1******5678 我得到:+*******5678

我究竟做错了什么?

标签: javaregex

解决方案


使用单个正则表达式屏蔽电话号码可能很复杂。一段时间后,可能需要一段时间才能回忆起 regexp(?<!^\+)[0-9](?=[0-9]{4})的作用

更直接的解决方案是使用substring方法和简单的替换replaceAll("\\d", "*")

private static String maskPhoneNumber(String tel) {
  if (tel.length() < 6) {
    return tel;
  }
  return tel.substring(0, 2)
      + tel.substring(2, tel.length() - 4).replaceAll("\\d", "*")
      + tel.substring(tel.length() - 4);
}

例子

maskPhoneNumber("+13334445678"); // +1******5678
maskPhoneNumber("+1-333-444-5678"); // +1-***-***-5678
maskPhoneNumber("+1 (333) 444-5678"); // +1 (***) ***-5678

如果您不想保留电话号码格式(破折号、空格、括号),请使用添加一个替换 ( replaceAll("[^\\d]", "")):

tel.substring(0, 2)
  + tel.substring(2, tel.length() - 4)
      .replaceAll("[^\\d]", "")
      .replaceAll("\\d", "*")
  + tel.substring(tel.length() - 4);

例子

maskPhoneNumber("+13334445678"); // +1******5678
maskPhoneNumber("+1-333-444-5678"); // +1******5678
maskPhoneNumber("+1 (333) 444-5678"); // +1******5678

这种命令式代码不像单个正则表达式那么优雅,但可能更容易被任何开发人员理解。


推荐阅读