studio programacion móviles libros libro desarrollo desarrollar curso aprende aplicaciones java regex matcher

java - móviles - manual de programacion android pdf



Cómo extraer parámetros de una url dada (6)

En Java tengo:

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

Quiero obtener los valores de los parámetros depCity (PAR, NYC).

Así que creé regex:

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

m.find() está devolviendo falso. m.groups() está devolviendo la IllegalArgumentException .

¿Qué estoy haciendo mal?


No estoy seguro de cómo usaste find y group , pero esto funciona bien:

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 }

Sin embargo, si solo desea los valores, no la clave depCity= , puede usar m.group(1) o usar una expresión regular con miradas:

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

Funciona en el mismo código de Java que el anterior. Intenta encontrar una posición de inicio justo después de depCity= . Luego coincide con cualquier cosa, pero lo menos posible, hasta que llegue a un punto orientado hacia & hacia el final de la entrada.


No tiene que ser regex. Como creo que no hay un método estándar para manejar esto, estoy usando algo que copié de algún lugar (y quizás modifiqué un poco):

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

Entonces, cuando lo llames, obtendrás todos los parámetros y sus valores. El método maneja parámetros de múltiples valores, por lo tanto, la List<String> lugar de String , y en su caso, necesitará obtener el primer elemento de la lista.


Si spring-web está presente en classpath, se puede usar UriComponentsBuilder .

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


Si está desarrollando una aplicación de Android, intente esto:

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


Solución simple cree el mapa de todos los nombres y valores de parámetros y utilícelo :).

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


Tengo tres soluciones, la tercera es una versión mejorada de Bozho.

Primero, si no desea escribir cosas por sí mismo y simplemente usa una biblioteca, entonces use la clase URIBuilder de libcomponentes http de Apache: http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/utils/URIBuilder.html

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

Segundo:

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

Segundo:

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