2010-01-12 7 views
12

Tengo un cadena como esta:C# Los valores de extracto de pares de valores clave en la cadena

blablablamorecontentblablabla?name=michel&score=5&age=28&iliedabouttheage=true 

se parece a una cadena normal de consulta sí, pero no estoy en ningún contexto web

ahora desea extraer los valores (después del signo =) por su clave, por ejemplo, ¿cuál es el nombre (michel), el puntaje (5), la edad (28), etc.

Normalmente analizo la cadena como obtener la posición en la cadena de la palabra 'nombre', luego sume 5 (longitud de 'nombre =') y asigne a esta posición 'inicio' y luego busque & -señal y nombre esa posición 'final', y luego obtener la cadena entre el inicio y el final de la posición.

Pero debe haber una solución mejor, ¿es esto una expresión regular?

Respuesta

32

Trate System.Web.HttpUtility.ParseQueryString, pasando por todo lo que después el signo de interrogación. Debería usar el ensamblado System.Web, pero no debería requerir un contexto web.

+0

+1 para la herramienta correcta para el trabajo – STW

+0

muy agradable.de hecho correcto para el trabajo – Michel

3

En realidad no, esto se puede hacer simplemente con la función Split (lo que sigue es un poco de pseudo código, es necesario agregar controles enlazados)

string[] query = value.Split('?'); 
foreach (string pairs in query[1].Split('&') 
{ 
    string[] values = pairs.split('='); 
} 

A continuación, iterar sobre los valores de las variables y obtener las cosas que necesita .

+0

Esto va a regresar: values ​​= {"name", "michel & score", "5 & age", "28 & iliedabouttheage", "true"} para el ejemplo dado Creo – Lazarus

+0

@Lazarus - usted son correctos –

+1

¡Maldición, ya he usado mi "Correcto" para este año! ;) – Lazarus

1

como usted sugiere, recomendaría expresiones regulares, probablemente un patrón como

(?:.)*\?(.*\&.*)* 

Sé que hay algo más que se puede utilizar para hacer que la expresión regular para ignorar la primera parte [añadí, creo], pero No puedo pensar en eso Que le conseguiría un kVp, entonces tendría que dividir el resultado en "&" (String.split ('&'))

2

Se puede utilizar el método split

private static void DoIt() 
{ 
    string x = "blablablamorecontentblablabla?name=michel&score=5&age=28&iliedabouttheage=true"; 

    string[] arr = x.Split("?".ToCharArray()); 
    if (arr.Length >= 2) 
    { 
     string[] arr2 = arr[1].Split("&".ToCharArray()); 
     foreach (string item in arr2) 
     { 
      string[] arr3 = item.Split("=".ToCharArray()); 
      Console.WriteLine("key = " + arr3[0] + " value = " + arr3[1]); 
     } 
    } 
} 

Salida:

key = name value = michel 
key = score value = 5 
key = age value = 28 
key = iliedabouttheage value = true 
+0

+1 para el detalle. – Michel

2

Probablemente iré por la ruta de Split.

string input = "name=michel&score=5&age=28&iliedabouttheage=true"; 
string[] pairs = input.Split('&'); 
Dictionary<string,string> results = new Dictionary<string,string>(); 
foreach (string pair in pairs) 
{ 
    string[] paramvalue = pair.Split('='); 
    results.Add(paramvalue[0],paramvalue[1]); 
} 
+0

gracias. de hecho, mejor que la solución actual. – Michel

15

Si desea crear un diccionario de los pares clave/valor entonces se podría usar un poco de LINQ:

Dictionary<string, string> yourDictionary = 
    yourString.Split('?')[1] 
       .Split('&') 
       .Select(x => x.Split('=')) 
       .ToDictionary(y => y[0], y => y[1]); 

(Usted puede omitir la parte Split('?')[1] Si la cadena contiene sólo la cadena de consulta en lugar de la URL completa)

+0

wow. no me hubiera dado cuenta de eso ... – Michel

+0

Creo que el método 'HttpUtility.ParseQueryString' sugerido por Eric es una mejor solución general, pero si necesitaras un' Dictionary 'en lugar de' NameValueCollection', entonces esto hará truco. – LukeH

+1

¡Este comando de Linq es increíble! En Windows Phone, no tiene acceso a ParseQueryString y este código hace lo mismo, ¡gracias! –

Cuestiones relacionadas