web-dev-qa-db-ja.com

特定のURLからパラメーターを抽出する方法

In 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を返しています。

私は何を間違えていますか?

19
gospodin

正規表現である必要はありません。私はこのことを処理する標準的な方法がないと思うので、私はどこかからコピーした(そしておそらく少し変更した)ものを使用しています:

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で、あなたの場合は最初のリスト要素を取得する必要があります。

39
Bozho

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=_の直後の開始位置を見つけようとします。その後、_&_または入力の終わり。

14

Androidアプリケーションを開発している場合、これを試してください:

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

3つのソリューションがありますが、3番目のソリューションはBozhoの改良版です。

まず、自分で何かを書きたくなくて、単にlibを使用したい場合は、Apacheのhttpcomponents libのURIBuilderクラスを使用します。 http://hc.Apache.org/httpcomponents-client-ga/httpclient/apidocs/ org/Apache/http/client/utils/URIBuilder.html

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

第二:

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

三番:

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

spring-webがクラスパスに存在する場合、riComponentsBuilderを使用できます。

MultiValueMap<String, String> queryParams =
            UriComponentsBuilder.fromUriString(url).build().getQueryParams();
4
qza

シンプルなソリューションは、すべてのパラメーター名と値からマップを作成し、それを使用します:)。

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);
            }
2
manish Prasad