2010-01-12 77 views
12

我有一個這樣的字符串:C#中提取價值

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

看起來像一個普通的查詢字符串,是的,但我沒有在任何Web上下文

現在我想要提取他們的密鑰的值(例如,什麼是名稱(michel),分數(5),年齡(28)等)

通常我解析字符串像get單詞「名稱」的字符串中的位置,再加入5到它(的長度「名稱=」)和名稱這個位置「開始」然後搜索& - 設置並命名該位置'結束',然後獲取位置開始和結束之間的字符串。

但是,必須有一個更好的解決方案,這是一個正則表達式的事情嗎?

回答

32

嘗試System.Web.HttpUtility.ParseQueryString,傳遞一切問號後面。您需要使用System.Web程序集,但它不應該需要Web上下文。

+0

+1爲作業 – STW 2010-01-12 13:23:48

+0

很不錯的工具。對於細節,確實適合 – Michel 2010-01-12 15:04:27

3

不是真的,這可正好與Split函數來完成(下文是有點僞代碼,您需要添加綁定檢查)

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

然後遍歷變量中的值,並得到你需要的東西。

+0

對於給定示例,我相信這將返回:values = {「name」,「michel&score」,「5&age」,「28&iliedabouttheage」,「true」} – Lazarus 2010-01-12 13:12:55

+0

@Lazarus - you是正確的。 – 2010-01-12 13:16:06

+1

該死的,我已經用完今年的「正確」了! ;) – Lazarus 2010-01-12 16:09:44

1

如你所說,我會建議正則表達式,可能是一個像

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

我知道有別的東西,可以用來使正則表達式忽略第一部分[加入,我覺得]模式,但我想不起來。這將讓你一個KVP,那麼你必須在結果上的「&」分裂(String.Split(「&」))

2

您可以使用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]); 
     } 
    } 
} 

輸出:

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

+1的工作。 – Michel 2010-01-12 15:03:05

2

我可能會往下走的斯普利特航線。

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

謝謝。確實比當前的解決方案更好。 – Michel 2010-01-12 14:57:05

15

如果你想創建的鍵/值對的字典,那麼你可以使用一些LINQ的:

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

(你可以跳過Split('?')[1]的一部分,如果你的字符串包含只是查詢字符串而不是整個網址)

+0

哇。 – Michel 2010-01-12 14:56:26

+0

我認爲Eric提出的'HttpUtility.ParseQueryString'方法是一個更好的通用解決方案,但是如果你需要一個'Dictionary '而不是'NameValueCollection',那麼這將會做招。 – LukeH 2010-01-12 15:07:11

+1

這個Linq命令真棒!在Windows Phone中,您無權訪問ParseQueryString,並且此代碼也是如此,謝謝! – 2013-02-27 13:24:49