You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中Access Token正则匹配替换失败,求正确掩码实现方案

问题:无法正确掩码Payload中的AccessToken值

需求:将字符串格式的响应Payload里的accessToken值替换为等长的星号掩码,示例如下:
输入Payload字符串:

{"accessToken":"knjnandHJHJBhjHJhjGhjghjGHJGhjgHJGjIG6gg8F68c6F6f6F6d67f79GV78INy8c5SV8n98f5D6g89Byf5446f678u8878GF756d57899bVY7TC6c7VY8UBi9u8","accessTokenExpirationTime":1800}

期望输出:

{"accessToken":"*********************************************************************************************************************","accessTokenExpirationTime":1800}

现有Java代码无法完成匹配替换,代码如下:

String payload = PAYLOAD_STRING;
Pattern pattern = Pattern.compile("[a-zA-Z0-9]{126}$");
Matcher matcher = pattern.matcher(payload);
String result = matcher.replaceAll("<h1>*</h1>");
System.out.println(result);

原代码问题分析

  • 正则表达式错误:[a-zA-Z0-9]{126}$中的$表示匹配字符串末尾,但accessToken值后还有",accessTokenExpirationTime..."内容,根本不在字符串末尾,导致匹配失败。
  • 替换逻辑错误:用<h1>*</h1>替换会把整个token换成单个星号加HTML标签,无法生成和原token等长的星号掩码。

解决方案

方案1:正则匹配+等长星号替换

修改正则表达式精准匹配accessToken的取值部分,再通过匹配结果生成等长星号:

String payload = "{\"accessToken\":\"knjnandHJHJBhjHJhjGhjghjGHJGhjgHJGjIG6gg8F68c6F6f6F6d67f79GV78INy8c5SV8n98f5D6g89Byf5446f678u8878GF756d57899bVY7TC6c7VY8UBi9u8\",\"accessTokenExpirationTime\":1800}";
// 匹配accessToken键对应的字符串值
Pattern pattern = Pattern.compile("\"accessToken\":\"([a-zA-Z0-9]+)\"");
Matcher matcher = pattern.matcher(payload);
StringBuffer resultBuffer = new StringBuffer();

while (matcher.find()) {
    // 生成与原token长度一致的星号字符串
    String maskedToken = "*".repeat(matcher.group(1).length());
    matcher.appendReplacement(resultBuffer, "\"accessToken\":\"" + maskedToken + "\"");
}
matcher.appendTail(resultBuffer);

System.out.println(resultBuffer.toString());

方案2:JSON解析库(更可靠)

如果Payload是标准JSON格式,推荐用Jackson/Gson等专业库解析修改,避免正则的边界匹配问题:
以Jackson为例:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;

public class TokenMasker {
    public static void main(String[] args) throws Exception {
        String payload = "{\"accessToken\":\"knjnandHJHJBhjHJhjGhjghjGHJGhjgHJGjIG6gg8F68c6F6f6F6d67f79GV78INy8c5SV8n98f5D6g89Byf5446f678u8878GF756d57899bVY7TC6c7VY8UBi9u8\",\"accessTokenExpirationTime\":1800}";
        
        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode rootNode = objectMapper.readTree(payload);
        
        if (rootNode.has("accessToken") && rootNode.get("accessToken").isTextual()) {
            String originalToken = rootNode.get("accessToken").asText();
            // 修改accessToken值为等长星号
            ((ObjectNode) rootNode).put("accessToken", "*".repeat(originalToken.length()));
        }
        
        // 输出掩码后的JSON字符串
        System.out.println(objectMapper.writeValueAsString(rootNode));
    }
}

内容的提问来源于stack exchange,提问作者nadinCodeHat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 02:46:23