Análisis de URL usando expresiones regulares

Necesito analizar una URL en el siguiente formato:

http://www.example.com/?method=example.method&firstKey=firstValue&id=1893736&thirdKey=thirdValue

Todo lo que necesito es el valor de 1893736 dentro de & id = 1893736.

Necesito hacer el análisis en Objective-C para mi proyecto de iPhone. Entiendo que debe tener algo que ver con la expresión regular. Pero no tengo ni idea de cómo hacerlo.

Cualquier sugerencia sera apreciada. :)

preguntado el 28 de agosto de 12 a las 14:08

La URL no se abre correctamente... -

Porque es solo un ejemplo. -

¿Por qué razón necesitas expresiones regulares? puedes hacerlo con funciones simples como lastIndexOf, Substr y Split -

4 Respuestas

No necesitas una expresión regular para esto. Puedes intentar algo como esto

NSString *url = @"http://www.example.com/?method=example.method&firstKey=firstValue&id=1893736&thirdKey=thirdValue";

NSString *identifier = nil;

for (NSString *arg in [[[url pathComponents] lastObject] componentsSeparatedByString:@"&"]) {
  if ([arg hasPrefix:@"id="]) {
    identifier = [arg stringByReplacingOccurrencesOfString:@"id=" withString:@""];
  }
}

NSLog(@"%@", identifier);

Respondido 28 ago 12, 15:08

No uses expresiones regulares. Usar NSURL para extraer de manera confiable la cadena de consulta y luego usa el código de esta respuesta para analizar la cadena de consulta.

contestado el 23 de mayo de 17 a las 13:05

Utilice las este:

.*/\?(?:\w*=[^&]*&)*?(?:id=([^&]*))(?:&\w*=[^&]*)*

Y grap primer grupo: \1. obtendrás 1893736.

Simplificación

Si id puede constar de solo dígitos:

.*/\?(?:\w*=[^&]*&)*?(?:id=(\d*))(?:&\w*=[^&]*)*

Si no te importa captar grupos desinteresados ​​(utilizan el \3 or id en este caso):

.*/\?(\w*=.*?&)*?(id=(?<id>\d*))(&\w*=.*)*

más simple versión (uso \3):

.*/\?(.*?=.*?&)*(id=(\d*))(&.*?=.*)*

Respondido 28 ago 12, 16:08

¿Por qué una expresión regular tan estricta? Seguramente algo como @".*id=(\\d*)" sería adecuado? - Pablo.s

@ Paul.s Para asegurarse de que no coincida con otros parámetros. Por ejemplo: En una URL como http://www.example.com/?pid=1893736&id=123&cid=234 la expresión regular que sugirió coincidirá 234. - mmdemirbas

Ok, entonces seguramente esto es aún mucho más sucinto y ahora trata ese caso. @".*&id=(\\d*)" - Pablo.s

No, un ampersand antes id no es necesario: http://www.example.com/?id=1893736. Pero, si OP aprueba que el id puede constar de solo dígitos, luego reemplazando id=([^&]*) con id=(\d*) simplifica mi expresión regular, como sugirió. - mmdemirbas

ok, [^&]*& se puede simplificar a .*?&. - mmdemirbas

En lugar de usar expresiones regulares, puede dividir la representación de cadena de su instancia de NSURL. En su caso, puede dividir la cadena por el appersand (&), recorrer la matriz en busca del prefijo (id=) y obtener la subcadena del índice 2 (que es donde termina =).

Respondido 28 ago 12, 15:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.