我正试图在我的XML响应代码中屏蔽 AccountNumber 的所有内容。 AccountNumber有16位数字,我想掩盖前12位数并保留最后4位数。
XML响应:
<ns2:PaymentMethod>
<CCInfo xmlns="">
<AccountType>sdaj</AccountType>
<AccountNumber>1234567890123456</AccountNumber>
<AccountName>sdfsad</AccountName>
<ExpirationMonth>sdaf</ExpirationMonth>
<ExpirationYear>afgds</ExpirationYear>
</CCInfo>
</ns2:PaymentMethod>
<ns2:PaymentMethod>
<CCInfo xmlns="">
<AccountType>kyfkuk</AccountType>
<AccountNumber>098765432123987</AccountNumber>
<AccountName>hjvkv</AccountName>
<ExpirationMonth>gfdgh</ExpirationMonth>
<ExpirationYear>tdjk</ExpirationYear>
</CCInfo>
</ns2:PaymentMethod>
以下是我的java代码:
String accountNumberPatternString ="<AccountNumber>(^.{12})";
Pattern accountNumberPattern = Pattern.compile(accountNumberPatternString);
Matcher matcher = accountNumberPattern.matcher(data);
String maskedResult = matcher.replaceAll("<AccountNumber>*******");
我期待结果为:
<AccountNumber>************3456</AccountNumber>
但我的结果是:
<AccountNumber>1234567890123456</AccountNumber>
答案 0 :(得分:2)
^
错了。如果您只有数字,则还应该仅将数字与\d
匹配。并且()
parantheses是不必要的。
https://regex101.com/r/Uu6qTR/1
<AccountNumber>\d{12}
答案 1 :(得分:1)
我确定你知道dangers of parsing XML with regex,但是现在让我们忽略它。
根据您的更新要求,帐号的长度可能会有所不同,我建议使用Matcher.appendReplacement,如下所示:
Pattern p = Pattern.compile("(?<=<AccountNumber>)\\d*(?=\\d{4})");
Matcher m = p.matcher(data);
StringBuffer maskedResult = new StringBuffer();
while (m.find()) {
String thisMask = m.group(0).replaceAll(".", "*");
m.appendReplacement(maskedResult, thisMask);
}
m.appendTail(maskedResult);
System.out.println(maskedResult.toString());
请注意,在上面的示例中,我使用了正向后备(?<=)
来识别帐号的开头,然后使用正向前瞻(?=)
来确保保留四位数字。
最后,这是一个更强大的版本,可以处理带有字母,空格和/或短划线的帐号,例如"<AccountNumber> 123 456-78901FFA-56C </AccountNumber>"
:
Pattern p = Pattern.compile("(?<=<AccountNumber>)([-\\s\\w]*)((?:[a-zA-Z0-9][-_\\s]*){4})");
Matcher m = p.matcher(data);
StringBuffer maskedResult = new StringBuffer();
while (m.find()) {
String thisMask = m.group(1).replaceAll("[^-_\\s]", "*");
m.appendReplacement(maskedResult, thisMask + "$2");
}
m.appendTail(maskedResult);
System.out.println(maskedResult.toString());