How to extract parameters from a given url

后端 未结 7 545
佛祖请我去吃肉
佛祖请我去吃肉 2020-11-27 05:10

In Java I have:

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

I want to get values of depCity parameters (PA

相关标签:
7条回答
  • 2020-11-27 05:50

    Not sure how you used find and group, but this works fine:

    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
    }
    

    However, If you only want the values, not the key depCity= then you can either use m.group(1) or use a regex with lookarounds:

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

    It works in the same Java code as above. It tries to find a start position right after depCity=. Then matches anything but as little as possible until it reaches a point facing & or end of input.

    0 讨论(0)
  • 2020-11-27 05:57

    I have three solutions, the third one is an improved version of Bozho's.

    First, if you don't want to write stuff yourself and simply use a lib, then use Apache's httpcomponents lib's URIBuilder class: http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/utils/URIBuilder.html

    new URIBuilder("http://...").getQueryParams()...
    

    Second:

    // 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;
    }
    

    Third:

    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;
    }
    
    0 讨论(0)
  • 2020-11-27 05:57

    Simple Solution create the map out of all param name and values and use it :).

    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);
                }
    
    0 讨论(0)
  • 2020-11-27 05:59

    If spring-web is present on classpath, UriComponentsBuilder can be used.

    MultiValueMap<String, String> queryParams =
                UriComponentsBuilder.fromUriString(url).build().getQueryParams();
    
    0 讨论(0)
  • 2020-11-27 06:02

    same but with 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);
        }
    }
    
    0 讨论(0)
  • 2020-11-27 06:04

    It doesn't have to be regex. Since I think there's no standard method to handle this thing, I'm using something that I copied from somewhere (and perhaps modified a bit):

    public static Map<String, List<String>> getQueryParams(String url) {
        try {
            Map<String, List<String>> params = new HashMap<String, List<String>>();
            String[] urlParts = url.split("\\?");
            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");
                    }
    
                    List<String> values = params.get(key);
                    if (values == null) {
                        values = new ArrayList<String>();
                        params.put(key, values);
                    }
                    values.add(value);
                }
            }
    
            return params;
        } catch (UnsupportedEncodingException ex) {
            throw new AssertionError(ex);
        }
    }
    

    So, when you call it, you will get all parameters and their values. The method handles multi-valued params, hence the List<String> rather than String, and in your case you'll need to get the first list element.

    0 讨论(0)
提交回复
热议问题