如何在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转义的&还原为&,得到可解析的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
相关产品推荐
相关产品推荐

