我有一个这样的字符串:
blablablamorecontentblablabla?name=michel&score=5&age=28&iliedabouttheage=true
看起来像常规查询字符串是,但我不在任何网络上下文
现在我想通过键提取值(在=符号后面),例如,名称(michel),分数(5),年龄(28)等。
通常我解析字符串就像获取单词'name'的字符串中的位置,然后将5添加到它(长度'name =')并将此位置命名为'start'然后搜索& -sign并将该位置命名为“end”,然后在位置start和end之间获取字符串。
但必须有一个更好的解决方案,这是一个正则表达式吗?
答案 0 :(得分:32)
尝试System.Web.HttpUtility.ParseQueryString,传递问号后的所有内容。您需要使用System.Web程序集,但它不需要Web上下文。
答案 1 :(得分:15)
如果你想创建一个键/值对的字典,那么你可以使用一点LINQ:
Dictionary<string, string> yourDictionary =
yourString.Split('?')[1]
.Split('&')
.Select(x => x.Split('='))
.ToDictionary(y => y[0], y => y[1]);
(如果您的字符串只包含查询字符串而不是整个网址,则可以跳过Split('?')[1]
部分。)
答案 2 :(得分:3)
不是真的,这可以通过Split函数来完成(以下是有点伪代码,你需要添加绑定检查)
string[] query = value.Split('?');
foreach (string pairs in query[1].Split('&')
{
string[] values = pairs.split('=');
}
然后迭代值变量并获得所需的东西。
答案 3 :(得分:2)
您可以使用拆分方法
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
答案 4 :(得分: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]);
}
答案 5 :(得分:1)
正如你的建议,我会推荐正则表达式,可能是像
这样的模式(?:.)*\?(.*\&.*)*
我知道还有其他东西可以用来让正则表达式忽略第一部分[我想补充],但我想不到它。这会让你获得一个kvp,然后你必须将结果拆分为“&amp;” (String.Split( '&安培;'))
答案 6 :(得分:0)
你可以分开'&amp;'然后一个'='。你必须处理'?'在开始。或者如果字符串总是“看起来”像一个查询字符串,那么你仍然可以像这样对待它并尝试类似这样的类QueryString class useful for querystring manipulation, appendage, etc