【发布时间】:2018-02-03 17:27:57
【问题描述】:
所以我想匹配信用卡号并以 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 [Thread-Name] [Class-Name] [MethodName] 信用卡持有人 12345678901234567 02/2022 123 ......”
【问题讨论】:
-
为什么要为此使用正则表达式?
String masked = num.substring(0,6) + "******" + num.substring(12,16) -
如果你真的需要正则表达式解决方案,那么看看
Pattern#appendReplacement -
@slim 因为我不知道字符串中有什么以及有多少信用卡号(如果有的话)
-
啊,等等,你是说用它来查找和替换包含任意文本的长字符串中的数字,其中包含信用卡号码?如果是这样,您应该编辑问题以解释这一点——举一个输入文本示例。