2010-01-12 45 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