如何从 HttpUtility.ParseQueryString 中提取特定大小写字段



.net 标准库函数 System.Web.HttpUtility.ParseQueryString 将查询字符串解析为名称/值对。

var a = HttpUtility.ParseQueryString("abc=123&def=456");
var x = a["abc"]; /* "123" */

当有两个字段具有相同的名称,只是它们的大小写不同时,返回的对象会用逗号将这两个值组合在一起。

var a = HttpUtility.ParseQueryString("abc=123&ABC=456");
var x = a["abc"]; /* "123,456" */

我怎样才能自己拉出"abc"部分?希望无需重写解析器或预处理字符串。

使用 parseQuerystring 不可能有两个名称相同且大小写不同的键,因为它的返回类型是 NameValueCollection,其默认行为是提供唯一键的集合,如果您尝试在此集合中添加相同的键,默认情况下,add 将以逗号分隔,与现有键值分隔。

让我知道这是否有帮助。

希望无需重写解析器或预处理字符串。

我认为这是不可能的,但这里有一个有点简洁的实现,应该可以解决问题:

string pattern = @"(?<=^|&)(w+)(?==)=(w+)(?=&?)";
string input = @"abc=123&ABC=456&abc=789";
Dictionary<string, string> parameters = new Dictionary<string, string>();
foreach (Match m in Regex.Matches(input, pattern))
{
    if (parameters.ContainsKey(m.Groups[1].Value))
    {
        //preserve original behaviour, i.e. concat values of same parameters
        parameters[m.Groups[1].Value] = parameters[m.Groups[1].Value] + "," + m.Groups[2].Value;
    } else
    {
        parameters.Add(m.Groups[1].Value, m.Groups[2].Value);
    }
}

如果 Unicode 参数超出a-zA-Z0-9_,这可能会失败,因此您可能需要编辑正则表达式以满足您的需求。

相关内容

  • 没有找到相关文章

最新更新