如何从给定的 URL 中提取参数

2022-09-01 19:38:38

在Java中,我有:

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

我想获取参数的值(PAR,NYC)。depCity

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

String regex = "depCity=([^&]+)";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(params);

m.find()返回 false。 正在返回 。m.groups()IllegalArgumentException

我做错了什么?


答案 1

它不必是正则表达式。由于我认为没有标准方法来处理这件事,所以我使用的是从某个地方复制的东西(也许修改了一下):

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

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


答案 2

不确定您如何使用 和 ,但这工作正常:findgroup

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)

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

它的工作原理与上述Java代码相同。它尝试在 之后立即找到一个起始位置。然后匹配任何内容,但尽可能少,直到它到达面向或结束输入的点。depCity=&