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

如何在Java中提取参数值含&符号的URL查询参数?

Java提取URL查询参数实现方法

针对你给出的URL示例(http://localhost:8080?v1=a&v2=b&c&v3=d),要得到v1=a、v2=b&c、v3=d的结果,可按以下步骤实现:

步骤1:还原HTML转义的&符号

首先需要将URL中的&替换为&,得到原始查询串格式:

String urlStr = "http://localhost:8080?v1=a&v2=b&c&v3=d";
// 替换所有HTML转义的&为实际的&符号
String decodedUrl = urlStr.replaceAll("&", "&");

步骤2:拆分查询串并处理特殊参数

由于需求中v2的值包含&c,说明这里的&是参数值的一部分而非分隔符,需要自定义逻辑处理:

import java.net.URL;
import java.util.HashMap;
import java.util.Map;

public class QueryParamExtractor {
    public static void main(String[] args) throws Exception {
        String urlStr = "http://localhost:8080?v1=a&v2=b&c&v3=d";
        String decodedUrl = urlStr.replaceAll("&", "&");
        
        URL url = new URL(decodedUrl);
        String query = url.getQuery();
        Map<String, String> paramMap = new HashMap<>();
        
        if (query != null && !query.isEmpty()) {
            String[] parts = query.split("&");
            String currentKey = null;
            
            for (String part : parts) {
                if (part.contains("=")) {
                    // 包含=,说明是新的键值对
                    String[] keyValue = part.split("=", 2); // 只按第一个=拆分
                    currentKey = keyValue[0];
                    paramMap.put(currentKey, keyValue[1]);
                } else {
                    // 不包含=,说明是前一个参数值的一部分
                    if (currentKey != null) {
                        String existingValue = paramMap.get(currentKey);
                        paramMap.put(currentKey, existingValue + "&" + part);
                    }
                }
            }
        }
        
        // 输出结果
        for (Map.Entry<String, String> entry : paramMap.entrySet()) {
            System.out.println(entry.getKey() + "=" + entry.getValue());
        }
    }
}

代码说明

  • 先通过replaceAll将HTML转义的&amp;还原为&,得到可解析的URL。
  • 使用URL类获取查询串部分。
  • 遍历拆分后的查询片段:
    • 若片段包含=,则视为新的参数键值对,记录当前参数名并存储值。
    • 若片段不包含=,则将其追加到前一个参数的值中(用&连接)。
  • 最终得到的paramMap即为所需的参数映射,输出结果为:
    v1=a
    v2=b&c
    v3=d
    

注意事项

如果你的URL中参数值里的&是经过URL编码的(即%26),那么无需自定义逻辑,直接使用java.net.URI即可正确解析:

import java.net.URI;
import java.util.List;
import java.util.Map;

public class StandardParamExtractor {
    public static void main(String[] args) throws Exception {
        // 假设原始URL中v2的值是b&c,编码后为b%26c
        String encodedUrl = "http://localhost:8080?v1=a&v2=b%26c&v3=d";
        URI uri = new URI(encodedUrl);
        Map<String, List<String>> params = uri.getQueryParams();
        
        for (Map.Entry<String, List<String>> entry : params.entrySet()) {
            System.out.println(entry.getKey() + "=" + entry.getValue().get(0));
        }
    }
}

这段代码会直接输出v2=b&c,因为%26会被自动解码为&。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 12:10:49