簡體   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