2010-01-12 20 views
12

mam ciąg jak poniżej:c Wartości ekstrakt # z par klucz-wartość w ciąg

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

wygląda jak zwykły ciąg kwerendy Tak, ale nie jestem w dowolnym kontekście internetowej

teraz chcesz wyodrębnić wartości (po znaku =) przez ich klucz, na przykład, jaka jest nazwa (michel), wynik (5), wiek (28) itp.

Normalnie parsuję ciąg znaków jak pozycję w łańcuchu słowa "nazwa", a następnie dodaj do niej 5 (długość "nazwa =") i nazwij tę pozycję "start", a następnie wyszukaj numer & -zarejestruj i nazwij pozycję "koniec", a następnie pobierz ciąg między początkiem i końcem pozycji.

Ale musi być lepsze rozwiązanie, czy to jest regex?

Odpowiedz

32

Spróbuj System.Web.HttpUtility.ParseQueryString, przekazując wszystko po znaku zapytania. Konieczne będzie użycie zestawu System.Web, ale nie powinno to wymagać kontekstu WWW.

+0

+1 za właściwe narzędzie do pracy – STW

+0

bardzo ładne.rzeczywiście do pracy – Michel

3

Nie bardzo, można to zrobić tylko przy użyciu funkcji Split (co za tym idzie jest trochę pseudo kod, trzeba dodać kontrole związany)

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

Następnie iteracyjne nad wartościami zmiennych i inne rzeczy, które trzeba .

+0

To powróci: values ​​= {"name", "michel & score", "5 & age", "28 i iliedabouttheage", "true"} dla danego przykładu Wierzę, że – Lazarus

+0

@Lazarus - ty są poprawne. –

+1

Cholera, już w tym roku zużyłem moje "Bycie właściwym"! ;) – Lazarus

1

Jak zasugerował, polecam regex, prawdopodobnie Wzorzec jak

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

wiem, że jest coś, co może być wykorzystane do spowodowania regex do ignorowania pierwszą część [dodaną, myślę], ale Nie mogę o tym myśleć. Że dostanie wam KVP, wówczas trzeba by podzielić wynik na „&” (String.split („&”))

2

Można użyć metody 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]); 
     } 
    } 
} 

wyjściowa:

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

+1 za szczegóły. – Michel

2

Najprawdopodobniej zejdę z trasy w Splicie.

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

dzięki. w rzeczywistości lepsze niż obecne rozwiązanie. – Michel

15

Jeśli chcesz utworzyć słownik par klucz/wartość, a następnie można użyć trochę LINQ:

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

(Można pominąć Split('?')[1] część, jeśli ciąg zawierał zaledwie ciągu kwerendy zamiast całego adresu URL.)

+0

wow. sam bym tego nie wymyślił ... – Michel

+0

Myślę, że metoda "HttpUtility.ParseQueryString" zasugerowana przez Eric jest lepszym ogólnym rozwiązaniem, ale jeśli potrzebowałeś 'Dictionary ' zamiast 'NameValueCollection', to zrobi to sztuczka. – LukeH

+1

To polecenie Linq jest niesamowite! W Windows Phone nie masz dostępu do ParseQueryString, a ten kod robi to samo, dziękuję! –

Powiązane problemy