Java 如何从给定url提取参数

Java 如何从给定url提取参数,java,regex,matcher,Java,Regex,Matcher,在Java中,我有: String params = "depCity=PAR&roomType=D&depCity=NYC"; 我想获得depCity参数(PAR,NYC)的值 所以我创建了正则表达式: String regex = "depCity=([^&]+)"; Pattern p = Pattern.compile(regex); Matcher m = p.matcher(params); m.find()返回falsem.groups()正在返回Ill

在Java中,我有:

String params = "depCity=PAR&roomType=D&depCity=NYC";
我想获得
depCity
参数(PAR,NYC)的值

所以我创建了正则表达式:

String regex = "depCity=([^&]+)";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(params);
m.find()
返回false
m.groups()
正在返回
IllegalArgumentException


我做错了什么?

不必是正则表达式。因为我认为没有标准的方法来处理这件事,所以我使用的是我从某处复制的东西(可能有点修改):

公共静态映射getQueryParams(字符串url){
试一试{
Map params=新的HashMap();
字符串[]urlParts=url.split(“\\?”);
如果(urlParts.length>1){
字符串查询=urlParts[1];
for(字符串参数:query.split(&)){
字符串[]对=参数拆分(“”);
字符串key=urldecker.decode(对[0],“UTF-8”);
字符串值=”;
如果(配对长度>1){
value=urldecker.decode(对[1],“UTF-8”);
}
列表值=params.get(键);
如果(值==null){
值=新的ArrayList();
参数put(键、值);
}
增加(价值);
}
}
返回参数;
}捕获(不支持DencodingException ex){
抛出新断言错误(ex);
}
}

因此,当您调用它时,您将获得所有参数及其值。该方法处理多值参数,因此是
列表
而不是
字符串
,在您的情况下,您需要获取第一个列表元素。

不确定如何使用
查找
,但这很好:

String params = "depCity=PAR&roomType=D&depCity=NYC";

try {
    Pattern p = Pattern.compile("depCity=([^&]+)");
    Matcher m = p.matcher(params);
    while (m.find()) {
        System.out.println(m.group());
    } 
} catch (PatternSyntaxException ex) {
    // error handling
}
但是,如果只需要值,而不需要键
depCity=
,则可以使用
m.group(1)
或使用带有lookarounds的正则表达式:

Pattern p = Pattern.compile("(?<=depCity=).*?(?=&|$)");

Pattern p=Pattern.compile((?我有三个解决方案,第三个是Bozho的改进版本

首先,如果您不想自己编写东西而只是使用库,那么请使用Apache的httpcomponents库的URIBuilder类:

第二:

// overwrites duplicates
import org.apache.http.NameValuePair;
import org.apache.http.client.utils.URLEncodedUtils;
public static Map<String, String> readParamsIntoMap(String url, String charset) throws URISyntaxException {
    Map<String, String> params = new HashMap<>();

    List<NameValuePair> result = URLEncodedUtils.parse(new URI(url), charset);

    for (NameValuePair nvp : result) {
        params.put(nvp.getName(), nvp.getValue());
    }

    return params;
}
//覆盖重复项
导入org.apache.http.NameValuePair;
导入org.apache.http.client.utils.URLEncodedUtils;
公共静态映射readParamsIntoMap(字符串url,字符串字符集)引发URI语法异常{
Map params=新的HashMap();
List result=URLEncodedUtils.parse(新的URI(url),字符集);
对于(NameValuePair nvp:result){
参数put(nvp.getName(),nvp.getValue());
}
返回参数;
}
第三:

public static Map<String, List<String>> getQueryParams(String url) throws UnsupportedEncodingException {
    Map<String, List<String>> params = new HashMap<String, List<String>>();
    String[] urlParts = url.split("\\?");
    if (urlParts.length < 2) {
        return params;
    }

    String query = urlParts[1];
    for (String param : query.split("&")) {
        String[] pair = param.split("=");
        String key = URLDecoder.decode(pair[0], "UTF-8");
        String value = "";
        if (pair.length > 1) {
            value = URLDecoder.decode(pair[1], "UTF-8");
        }

        // skip ?& and &&
        if ("".equals(key) && pair.length == 1) {
            continue;
        }

        List<String> values = params.get(key);
        if (values == null) {
            values = new ArrayList<String>();
            params.put(key, values);
        }
        values.add(value);
    }

    return params;
}
public静态映射getQueryParams(字符串url)引发UnsupportedEncodingException{
Map params=新的HashMap();
字符串[]urlParts=url.split(“\\?”);
如果(urlParts.length<2){
返回参数;
}
字符串查询=urlParts[1];
for(字符串参数:query.split(&)){
字符串[]对=参数拆分(“”);
字符串key=urldecker.decode(对[0],“UTF-8”);
字符串值=”;
如果(配对长度>1){
value=urldecker.decode(对[1],“UTF-8”);
}
//跳过?&和&&
如果(“.equals(key)&&pair.length==1){
继续;
}
列表值=params.get(键);
如果(值==null){
值=新的ArrayList();
参数put(键、值);
}
增加(价值);
}
返回参数;
}

如果您正在开发Android应用程序,请尝试以下方法:

String yourParam = null;
Uri uri = Uri.parse(url);
try {
    yourParam = URLDecoder.decode(uri.getQueryParameter(PARAM_NAME), "UTF-8");
} catch (UnsupportedEncodingException exception) {
    exception.printStackTrace();
}        

简单解决方案使用所有参数名称和值创建映射并使用它:)

import org.apache.commons.lang3.StringUtils;
公共字符串拆分url(字符串url,字符串参数){
HashMap urlMap=新的HashMap();
字符串queryString=StringUtils.substringAfter(url,“?”);
对于(字符串参数:queryString.split(“&”)){
put(StringUtils.substringBefore(param,“=”),StringUtils.substringAfter(param,“=”);
}
返回urlMap.get(参数);
}
如果类路径上存在SpringWeb,则可以使用UriComponentsBuilder

MultiValueMap<String, String> queryParams =
            UriComponentsBuilder.fromUriString(url).build().getQueryParams();
多值映射查询参数=
UriComponentsBuilder.FromUristing(url.build().getQueryParams();

相同,但有jsonobject:

public static JSONObject getQueryParams2(String url) {
    JSONObject json = new JSONObject();
    try {
        String[] urlParts = url.split("\\?");
        JSONArray array = new  JSONArray();
        if (urlParts.length > 1) {
            String query = urlParts[1];
            for (String param : query.split("&")) {
                String[] pair = param.split("=");
                String key = URLDecoder.decode(pair[0], "UTF-8");
                String value = "";
                if (pair.length > 1) {
                    value = URLDecoder.decode(pair[1], "UTF-8");
                    if(json.has(key)) {
                        array = json.getJSONArray(key);
                        array.put(value);
                        json.put(key, array);
                        array = new JSONArray();
                    } else {
                        array.put(value);
                        json.put(key, array);
                        array = new JSONArray();
                    }
                }
            }
        }
        return json;
    } catch (Exception ex) {
        throw new AssertionError(ex);
    }
}

这个解决方案也很有效,但就我个人而言,我不喜欢地图-我尝试使用更简单的解决方案。但无论如何,谢谢!地图是一个非常核心和简单的概念,所以我不认为它们有什么问题。这个解决方案不考虑URL的片段部分,它是附加在#“。在http URL中,此部分引用内部锚点。因此,必须在“#”处再次拆分变量查询,然后必须进一步处理返回数组的索引0。#之后的部分不会提交到服务器,它将为“/foo?”等拐角情况引发ArrayIndexOutOfBoundException”只是一个小提示:我使用的是ApacheHttpClient库,而不是使用复杂的模式“(?“Bozho的改进版”?”这是一种亵渎。第一个解决方案非常方便。您使用什么库来
Uri
class?导入android.net.Uri;提示:
添加字符串param=urldecker.decode(param,“UTF-8”);
内部循环可能重复的
import org.apache.commons.lang3.StringUtils;

    public String splitURL(String url, String parameter){
                HashMap<String, String> urlMap=new HashMap<String, String>();
                String queryString=StringUtils.substringAfter(url,"?");
                for(String param : queryString.split("&")){
                    urlMap.put(StringUtils.substringBefore(param, "="),StringUtils.substringAfter(param, "="));
                }
                return urlMap.get(parameter);
            }
MultiValueMap<String, String> queryParams =
            UriComponentsBuilder.fromUriString(url).build().getQueryParams();
public static JSONObject getQueryParams2(String url) {
    JSONObject json = new JSONObject();
    try {
        String[] urlParts = url.split("\\?");
        JSONArray array = new  JSONArray();
        if (urlParts.length > 1) {
            String query = urlParts[1];
            for (String param : query.split("&")) {
                String[] pair = param.split("=");
                String key = URLDecoder.decode(pair[0], "UTF-8");
                String value = "";
                if (pair.length > 1) {
                    value = URLDecoder.decode(pair[1], "UTF-8");
                    if(json.has(key)) {
                        array = json.getJSONArray(key);
                        array.put(value);
                        json.put(key, array);
                        array = new JSONArray();
                    } else {
                        array.put(value);
                        json.put(key, array);
                        array = new JSONArray();
                    }
                }
            }
        }
        return json;
    } catch (Exception ex) {
        throw new AssertionError(ex);
    }
}