用于屏蔽字母数字代码的 Java 正则表达式

问题描述 投票:0回答:2

我需要帮助来使用或构建正则表达式以使用 * 掩盖字母数字。

我用这个表达式尝试过,但是当字符串中间有零时它无法正常工作:

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

现场样品: https://www.regexplanet.com/share/index.html?share=yyyyf47wp3r

输入 输出
0001113033AA55608981 0001113*********8981
23456237472347823923 2345************3923
00000000090000000000 0000000009000***0000
09008000800060050000 09008************0000
AAABBBBCCCCDDDDEEEE AAA************EEEE
0000BBBBCCCCDDDDEEEE 0000BBBB********EEEE

规则是:

  1. 前 4 个非零,后 4 个 a 必须显示。
  2. 前导零将被忽略,但不会被删除或替换。
java regex pcre replaceall
2个回答
0
投票

您可以将初始零和紧随其后的 3 个字母数字字符捕获到一组中,将中间部分捕获到第二组中,然后将最后 4 个字母数字字符捕获到第三组中,然后仅替换第二组中的每个字符。

这是一个示例(兼容 Java 11):

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

请参阅 Java 演示

正则表达式匹配

  • ^
    - 字符串的开头
  • (0*\w{3})
    - 第 1 组:零个或多个
    0
    字符,然后是任意三个字母数字/下划线字符
  • (.*)
    - 第 2 组:除了换行符之外的任何零个或多个字符(如果只允许“单词”字符,请替换为
    \w*
  • (\w{4})
    - 第 3 组:四个“单词”字符
  • $
    - 字符串结尾。

-1
投票

一个好的正则表达式是

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

不幸的是,在Java中你不能使用无限制的lookbehinds,但是你可以使用

(?<=[^0]\w{3,14})\w(?=\w{4})

如果您知道字符串的长度最多为 20 个字符(14 = 20 减去第一个字符,减去您匹配的字符,再减去最后 4 个字符)。

查看演示此处

© www.soinside.com 2019 - 2024. All rights reserved.