Java中用于电话号码屏蔽的正则表达式

4
我需要掩盖一个电话号码。
90 511 619 11 21

like this

5**6**1*2*

首先,我会检查是否包含90(国家代码),并将其删除。

if (number.length() > 2 && number.substring(0,2).contains("90")){
            number = number.replaceAll(number.substring(0,2), "");
        }

然后我要去除所有空格,但是在正则表达式部分卡住了。
number = number.replaceAll(" ", "").replaceAll("\\d(?=\\d{4})", "*");
4个回答

6

我们可以不使用任何捕获组来解决这个问题:

String input = "533 619 11 21";
input = input.replaceAll("(?<=\\d)\\d", "*").replaceAll(" ", "");
System.out.println(input);

5**6**1*2*

这里的替换逻辑是,任何一个紧跟在数字后面的单个数字都会被替换为星号。当然,第一个数字不会被替换。
请注意,我假设您已经有某种方法来删除国家代码。
演示:

Demo


(?<=\d)\d+ 也可以 - Shen Yudong
1
@YCF_L 谢谢...我漏掉了那个要求。 - Tim Biegeleisen

3

\d(?<=\d{2})

Regex101演示

对于您的代码,请在*后替换空格:

number = number.replaceAll("\\d(?<=\\d{2})", "*").replaceAll(" ", "");

注:该正则表达式用于匹配两个数字之间的单个数字,并将其替换为星号。

1
尝试在已删除90的字符串上应用此正则表达式:
(?<! |^)\d

将其替换为*。这将生成5** 6** 1* 2*

它查找后面并断言没有空格或字符串的开头,然后匹配一个数字。

然后,您只需将所有空格替换为空字符串即可获得5**6**1*2*


1
我猜这对你可能有用:

^(?:90 *)?(\d)\d{2} *(\d)\d{2} *(\d)\d *(\d)\d$

替换为:

用这个来代替:

$1**$2**$3*$4*

说明:

正则表达式 101 演示

Java 示例代码(在此运行):

final String regex = "^(?:90 *)?(\\d)\\d{2} *(\\d)\\d{2} *(\\d)\\d *(\\d)\\d$";
final String string = "90 533 619 11 21";
final String subst = "$1**$2**$3*$4*";

final Pattern pattern = Pattern.compile(regex);
final Matcher matcher = pattern.matcher(string);

final String result = matcher.replaceFirst(subst);
System.out.println(result);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接