我需要一个帮助来使用或建立一个正则表达式来屏蔽字母数字与*.

我试过这个表达式,但是当字符串中间有零时,它就不能正常工作了:

(?<=[^0].{3})\w+(?=\w{4})

活样本: https://www.regexplanet.com/share/index.html?share=yyyyf47wp3r

Input Output
0001113033AA55608981 0001113*********8981
23456237472347823923 2345************3923
00000000090000000000 0000000009000***0000
09008000800060050000 09008***********0000
AAAABBBBCCCCDDDDEEEE AAAA************EEEE
0000BBBBCCCCDDDDEEEE 0000BBBB********EEEE

规则是:

  1. 必须显示前4个不为零,最后4个a.
  2. 前导零将被忽略,但不会被删除或替换.

推荐答案

您可以在一组中捕获首个零和紧随其后的3个字母数字字符,中间部分进入第二组,然后最后4个字母数字字符进入第三组,然后只替换第二组中的每个字符.

下面是一个示例(与Java 11兼容):

String text = "0001113033AA55608981";
Matcher mr = Pattern.compile("^(0*\\w{4})(.*)(\\w{4})$").matcher(text);
text = mr.replaceFirst(m -> m.group(1) + "*".repeat(m.group(2).length()) + m.group(3));
System.out.println(text); // => 0001113**********8981

Java demo

正则表达式匹配

  • ^—字符串开始
  • (0*\w{4})—组1:零个或多个0字符,然后是任意四个数字/下划线字符
  • (.*)—第2组:除行号字符以外的任何零个或多个字符(如果只允许"word"字符,则替换为\w*)
  • (\w{4})-第三组:四个"单词"字符
  • $—字符串的结尾

Java 8兼容版本:

String text = "0001113033AA55608981";
Matcher m = Pattern.compile("^(0*\\w{4})(.*)(\\w{4})$").matcher(text);
StringBuffer result = new StringBuffer();
while (m.find()) {
    m.appendReplacement(result, m.group(1) + String.join("", Collections.nCopies(m.group(2).length(), "*")) + m.group(3));
}
m.appendTail(result);
System.out.println(result.toString());

Java code demo online

但你可以直接用

String text = "0001113033AA55608981";
Matcher m = Pattern.compile("^(0*\\w{4})(.*)(\\w{4})$").matcher(text);
String result = "";
if (m.matches()) {
    result = m.group(1) + String.join("", Collections.nCopies(m.group(2).length(), "*")) + m.group(3);
}
System.out.println(result);

Java相关问答推荐

方法没有用正确的值填充数组—而是将数组保留为null,'

将成为一个比较者.比较…在现代Java中,编译器会对`CompareTo`方法进行优化吗?

路径映射未发生

按属性值从流中筛选出重复项

如何从Keyloak映射Hibernate实体中的用户

如何将其他属性引用到log4j2 yaml配置中?

Spring安全令牌刷新和JWT签名与本地计算的签名不匹配

Java创建带有扩展通配符的抽象处理器

使用SWIG将C++自定义单元类型转换为基本Java类型

Java中HashSet的搜索时间与TreeSet的搜索时间

插入中的JOOQ序列,设置为VS值

如何在运行docker的应用程序中获取指定的配置文件

在不使用instanceof或强制转换的情况下从父类变量调用子类方法

判断重复的两个二维表算法?

Java.time.OffsetDateTime的SQL Server数据库列类型是什么?

活泼的一次判断成语,结果中等

如何使用Rascal Evaluator从编译的JAR访问Rascal函数?

如果c不为null,Arrays.sort(T[]a,Comparator<;?super T>;c)是否会引发ClassCastException?

java21预览未命名的符号用于try-with-resources

Java-Apache BufferedHttpEntity 在发送请求时加载整个文件