因此,我想匹配信用卡号并以6 * 4格式屏蔽它们。因此只有前6个字符和后4个字符可见。之间的字符将为“ *”。我试着用类似MASK的方式弄清楚。

private static final String MASK = "$1***$3";
matcher.replaceAll(MASK);


但找不到办法让我在中间获得与组$ 2相等的恒星长度。

然后,我实现了以下代码,并且可以正常工作。
但是我想问的是,是否有更短或更简单的方法来做到这一点。有人知道吗?

private static final String HIDING_MASK = "**********";
private static final String REGEX = "\\b([0-9]{6})([0-9]{3,9})([0-9]{4})\\b";
private static final int groupToReplace = 2;

private String formatMessage(String message) throws NotMatchedException {
    Matcher m = Pattern.compile(REGEX).matcher(message);

    if (!m.find()) throw new NotMatchedException();
    else {
        StringBuilder maskedMessage = new StringBuilder(message);
        do {
            maskedMessage.replace(m.start(groupToReplace), m.end(groupToReplace),
                    HIDING_MASK.substring(0, (m.end(groupToReplace) - m.start(groupToReplace))));

        } while(m.find(m.end()));

        return maskedMessage.toString();
    }
}


编辑:这是要处理的示例消息。
“ 2017.08.26 20:51 [线程名称] [类名称] [方法名称]信用卡持有人12345678901234567 02/2022 123 .........“

最佳答案

您可以使用以下代码简单地做到这一点:

str.replaceAll( "(?<=\\d{6})\\d(?=\\d{4})", "*" );

09-11 19:34