2010-01-12 16 views
12

tôi có một chuỗi như thế này:c giá trị # chiết xuất từ ​​cặp khóa-giá trị trong chuỗi

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

trông giống như một chuỗi truy vấn thường xuyên có, nhưng tôi không trong bất kỳ bối cảnh web

bây giờ tôi muốn trích xuất các giá trị (sau dấu =) bằng khóa của chúng, ví dụ: tên (michel), điểm số (5), độ tuổi (28), v.v.

Thông thường tôi phân tích chuỗi như vị trí trong chuỗi của từ 'tên', sau đó thêm 5 vào nó (chiều dài của 'name =') và đặt tên vị trí này là 'bắt đầu' sau đó tìm kiếm &đăng nhập và đặt tên cho vị trí đó là 'kết thúc', và sau đó lấy chuỗi giữa vị trí bắt đầu và kết thúc.

Nhưng phải có giải pháp tốt hơn, đây có phải là điều regex không?

Trả lời

32

Hãy thử System.Web.HttpUtility.ParseQueryString, chuyển qua mọi thứ sau dấu chấm hỏi. Bạn sẽ cần phải sử dụng hội đồng System.Web, nhưng nó không nên yêu cầu một ngữ cảnh web.

+0

+1 cho đúng công cụ cho công việc – STW

+0

rất đẹp.thực sự đúng cho công việc – Michel

3

Không thực sự, điều này có thể được thực hiện chỉ với hàm Split (những gì sau là kinda giả mã, bạn cần phải thêm kiểm tra ràng buộc)

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

Sau đó lặp qua các giá trị biến và nhận được những điều bạn cần .

+0

Điều này sẽ trả về: values ​​= {"name", "michel & score", "5 & age", "28 & iliedabouttheage", "true"} cho ví dụ đã cho tôi tin – Lazarus

+0

@Lazarus - bạn đúng. –

+1

Chết tiệt, tôi đã sử dụng hết "Quyền của tôi" trong năm nay rồi! ;) – Lazarus

1

Như bạn đề nghị, tôi muốn giới thiệu regex, có thể là một mô hình như

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

Tôi biết có điều gì đó khác mà có thể được sử dụng để gây ra regex để bỏ qua phần đầu tiên [thêm, tôi nghĩ], nhưng Tôi không thể nghĩ về nó. Điều đó sẽ giúp bạn có được kvp, sau đó bạn phải chia kết quả trên "&" (String.Split ('&'))

0

Bạn có thể thực hiện chia tách trên '&' và sau đó nhấn vào '='. Bạn sẽ phải đối phó với '?' lúc bắt đầu. Hoặc nếu chuỗi sẽ luôn 'tìm' giống như một chuỗi truy vấn sau đó bạn vẫn có thể đối xử với nó như vậy và thử một cái gì đó giống như lớp này QueryString class useful for querystring manipulation, appendage, etc

2

Bạn có thể sử dụng phương pháp phân chia

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

Output:

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

+1 cho chi tiết. – Michel

2

Tôi có thể đi xuống tuyến đường 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

cảm ơn. thực sự tốt hơn thì giải pháp hiện tại. – Michel

15

Nếu bạn muốn tạo ra một từ điển của các cặp khóa/giá trị sau đó bạn có thể sử dụng một chút LINQ:

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

(Bạn có thể bỏ qua phần Split('?')[1] nếu chuỗi của bạn chứa chỉ querystring thay vì toàn bộ URL.)

+0

wow. tôi không nghĩ rằng chính mình .. – Michel

+0

Tôi nghĩ rằng phương pháp 'HttpUtility.ParseQueryString' được Eric đề xuất là giải pháp tổng quát tốt hơn, nhưng nếu bạn cần' Dictionary 'thay vì' NameValueCollection' thì điều này sẽ thực hiện lừa. – LukeH

+1

Lệnh LINQ này thật tuyệt vời! Trong Windows Phone, bạn không có quyền truy cập vào ParseQueryString và mã này cũng vậy, cảm ơn bạn! –