【问题标题】:Parse a value = "pair" string into Dictionary将 value = "pair" 字符串解析为 Dictionary
【发布时间】:2014-10-21 04:21:08
【问题描述】:

我需要解析一个字符串以检索该字符串的所有 value = "pair"。我选择用一个简单的正则表达式来做到这一点。我的正则表达式是正确的,但我不记得如何简单地将我的结果,我的 MatchCollection 转换为一个简单的键值字典。

string headerName = context.Headers["Authorization"];
/* Authorization header
OAuth oauth_version="1.0", oauth_signature_method="HMAC-SHA1", oauth_nonce="K7WmP9YrR2oCYC3", oauth_timestamp="1413801976", oauth_consumer_key="test", oauth_signature="8ad2fZh23q%2FWfK6RykqcvhlLxH4%3D" */
string pattern = "(?<Keyword>\\w+)\\s*=\\s*\\\"(?<Value>\\w+)\\\"";
MatchCollection matches = Regex.Matches(headerName, pattern);

Dictionary<string, string> dictionary = new Dictionary<string,string>();

foreach(Match match in matches)
{
    dictionary.Add(match["Keyword"], match["Value"]); // This is wrong
}

【问题讨论】:

    标签: c# .net regex


    【解决方案1】:

    应该工作:

    var dic = matches.Cast<Match>()
                     .ToDictionary(m => m.Groups["Keyword"].Value,
                                   m => m.Groups["Value"].Value);
    

    附:我不会在这里使用 RegEx,而是使用简单的字符串处理:

    string header = context.Headers["Authorization"];
    string[] pairs = header.Split(',');
    var dic = pairs.Select(p => p.Trim().Split('='))
                   .ToDictionary(p => p[0], p => p[1]);
    

    更简单。

    【讨论】:

    • 这也是正确的。当循环做同样的事情并且做得更快时,我只是不喜欢使用这种写作方式。是的,我知道我们是少数有这种想法的程序员。这不尊重我的 KISS 规则。是的,这是 KISS,但循环更像是 KISS(保持简单和愚蠢)。
    • 为什么你认为循环会更快?有多快?使用 lambda 可能会增加一些开销。但我认为这将是不够的。比较可读性更好。只是我的观点。一个循环没问题,两个循环没问题。但是数百个循环是地狱。
    • @B413:请查看我的更新答案。它应该满足您对简单性的要求:)
    【解决方案2】:

    这是对的:

    dictionary.Add(match.Groups["Keyword"].Value, match.Groups["Value"].Value);
    

    你需要先从Groups集合中获取匹配组,然后获取组的值。

    【讨论】:

      猜你喜欢
      • 2012-03-23
      • 2018-12-19
      • 2011-10-07
      • 2014-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-08
      • 1970-01-01
      相关资源
      最近更新 更多