繁体   English   中英

用正则表达式打印 Java 中的电话号码,第二个字符和最后四个字符

[英]Masking Phone Number in Java with second character and last four characters printed with regular expressions

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

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

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

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

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

我究竟做错了什么?

使用单个正则表达式屏蔽电话号码可能很复杂。 一段时间后,可能需要一段时间才能回忆起正则表达式(?<?^\+)[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

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

如果要匹配最后 4 位数字,可以使用(.{4})\\s*$ 此正则表达式将从输入字符串返回最后 4 个字符,而不考虑末尾的空格。

您的模式\w(?=\w{4})也将匹配加号后的数字 1,因为它匹配一个单词字符并断言右边的内容应该是 4 个单词字符。

一种选择是在后面添加一个否定的lookbehind (?<!^\+)来断言左边的不是字符串^的开头,后跟一个加号。

您可以匹配数字[0-9]而不是匹配单词字符。

(?<!^\+)[0-9](?=[0-9]{4})

正则表达式演示| Java演示

例如

String s = "+13334445678";
System.out.println(s.replaceAll("(?<!^\\+)[0-9](?=[0-9]{4})", "*"));

Output

+1******5678

如果 is 不在字符串的开头,另一种选择可能是断言左边的不是前面没有非空白字符的加号:

(?<!(?<!\S)\+)[0-9](?=[0-9]{4})

正则表达式演示

如果您想保留格式中的任何破折号,这里有一个替代方法,使用 lambda 替换方法:

public static void main(String[] args) {
    Pattern phoneObfuscator = Pattern.compile("(?<=\\+\\d)[\\d-]+(?=\\d{4})");
    Pattern digit = Pattern.compile("\\d");

    List<String> numbers = List.of("+13334445678", "+1-123-456-7890");
    for (String number : numbers) { 
        String result = phoneObfuscator.matcher(number).replaceAll(
            m -> digit.matcher(m.group()).replaceAll("*"));
        System.out.printf("%s -> %s%n", number, result);
    }
}

它匹配 +N 和 NNNN 之间的整个字符串,并用*替换每个数字。

如果多次运行正则表达式,通常最好使用编译版本。

您可以使用捕获组来执行此任务。 正则表达式将匹配整个电话号码,包括国家代码。 由于您希望掩码值具有国家代码和最后四位数字,因此您将使用捕获组来捕获它们。 然后,您可以将它们包含在替换中。 下面的链接详细解释了正则表达式的每个部分的作用。

https://regexr.com/4rcq7

String text = "+13334445678 +11234567890";

String regex = "(\\+1)\\d{6}(\\d{4})";
String replacement = "$1******$2";

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);

System.out.println(matcher.replaceAll(replacement));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM