【问题标题】:Regex to mask multiple phone numbers (~) separated except last 4 digiits正则表达式屏蔽多个电话号码 (~),除了最后 4 位数字外
【发布时间】:2021-06-01 16:34:28
【问题描述】:

我正在尝试找到一个正则表达式,它可以屏蔽除最后 4 位之外的电话号码。

示例:phone=9988998888~7654321908~6789054321
期望的输出:phone=******8888~******1908~*****4321

我尝试了下面的正则表达式,但它只屏蔽了起始数字
phone=******8888~7654321908~6789054321

^(phone)=(\d(?=\d{4}))*

【问题讨论】:

  • 您是否打算只替换以phone= 开头的字符串?或者你的意思是text.replaceAll("\\d(?=\\d{4})", "*") 没问题?

标签: java regex replace masking regular-language


【解决方案1】:

使用replaceAll​(Function<MatchResult,​String> replacer)MatchResult 中的每个数字替换为“*”。

public class PhoneNumberMask {
    public static void main(String[] args) {
        String target = "phone=9988998888~7654321908~6789054321";
        Pattern pattern = Pattern.compile("(\\d+(?=\\d{4}))");
        Matcher matcher = pattern.matcher(target);
        String result = matcher.replaceAll((matchResult) -> matchResult.group(1).replaceAll("\\d", "*"));
        System.out.println(result);
    }
}

【讨论】:

    【解决方案2】:

    你可以使用:

    \d(?=\d{4})
    

    在线查看demo

    • \d - 任何一位数。
    • (?=\d{4}) - 4 位数的正向前瞻。

    替换为*

    Javademo

    【讨论】:

      【解决方案3】:

      假设您只想屏蔽以phone= 开头并以~ 分隔的字符串中的所有数字,您可以使用没有 lambda 的普通正则表达式解决方案替换为

      String masked = text.replaceAll("(\\G(?!^)(?:\\d{4}~)?|^phone=)\\d(?=\\d{4})", "$1*");
      

      请参阅regex demo详情

      • (\G(?!^)(?:\d{4}~)?|^phone=) - 第 1 组:上一次成功匹配的结尾,然后是可选的四位数字序列和 ~ 或字符串开头和 phone=
      • \d - 一个数字
      • (?=\d{4}) - 后跟任意四位数字。

      【讨论】:

      • 如果它应该以 phone= 开头,那么这是更精确的匹配 ++
      猜你喜欢
      • 1970-01-01
      • 2020-09-29
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-06
      • 2021-05-27
      相关资源
      最近更新 更多