用正则表达式屏蔽部分字符串

Masking part of the string with a regex

我们的想法是像处理信用卡一样屏蔽字符串。一行代码就可以搞定。它有效。但是,我找不到对本例中使用的正则表达式的任何直接解释。

public class Solution {
    public static void main(String[] args) {

        String t1 = "518798673672531762319871";
        System.out.println(t1.replaceAll(".(?=.{4})", "*"));
    }
}

输出为:********************9871

正则表达式的解释

.(?=.{4})
  • .:匹配任意字符
  • (?=:先行条件的开始
    • .{4}:断言存在 4 个字符
  • ):先行条件结束

简单来说,它匹配输入中当前位置右侧有 4 个字符的任何字符。

替换为"*",即对于inout中的每个匹配字符,替换为单个*字符,从而在先行条件失败时替换信用卡号中除最后4个字符外的所有字符匹配(因为我们不会在当前位置之前有 4 个字符)。

Read more on look arounds in regex

?=.{4} 是正向预测。它匹配括号内的模式(当前字符后的下一个 4 位数字)而不将其包含在主要结果中(括号外的 .)匹配所有其他字符以替换为 *

假设您的正则表达式逐个字符地遍历输入。在第一个数字 (5) 上,它询问 "is there a single char followed by 4 other chars? yes, ok.. replace [the 5] with *"

重复此操作直到第 9 个(倒数第 4 个,此时 "is there another 4 characters after this?" 问题变为 "no" 并且替换停止