我需要帮助来使用或构建正则表达式以使用 * 掩盖字母数字。
我用这个表达式尝试过,但是当字符串中间有零时它无法正常工作:
(?<=[^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 |
规则是:
您可以将初始零和紧随其后的 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 组:四个“单词”字符$
- 字符串结尾。一个好的正则表达式是
(?<=[^0]\w{3}\w*)\w(?=\w{4})
。
不幸的是,在Java中你不能使用无限制的lookbehinds,但是你可以使用
(?<=[^0]\w{3,14})\w(?=\w{4})
如果您知道字符串的长度最多为 20 个字符(14 = 20 减去第一个字符,减去您匹配的字符,再减去最后 4 个字符)。
查看演示此处。