正则表达式掩盖XML中的所有帐号,最后四位数

时间:2017-02-15 09:01:23

标签: java regex xml replace

我正试图在我的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>

2 个答案:

答案 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());