使用正则表达式从字符串构建字典

时间:2013-04-19 15:58:46

标签: c# regex string

说我有这个字符串:

var results = 
[{\r\n    \"ninja\": \"Leonardo - $0.99\",\r\n    \"data\": [[1336485655241,0.99],[1336566333236,0.99],[1336679536073,0.99],[1336706394834,0.99],[1336774593068,0.99],[1366284992043,0.99]]},
\r\n{\r\n    \"ninja\": \"Donatello - $0.25\",\r\n    \"data\": [[1361061084420,0.23],[1366102471587,0.25],[1366226367262,0.25],[1366284992043,0.25]]},
\r\n{\r\n    \"ninja\": \"Raphael - $0.15\",\r\n    \"data\": [[1327305600000,0.15], [1365583220422,0.15],[1365669396241,0.15],[1365669396241,0.15],[1365753433493,0.15],[1366284992043,0.15]]},\r\n\
r\n{\r\n    \"ninja\": \"Michelangelo - $0.14\",\r\n    \"data\": [1366284992043,0.14]]};

我想建立一个字典来存储忍者的名字和价格,这样我就可以:

Key \ Value

莱昂纳多\ 0.99

Donatello \ 0.25

Raphael \ 0.15

米开朗基罗\ 0.14

所以我几天以来一直在阅读很多关于正则表达式的内容,我不知道它是如何运作的。到目前为止,我有这行代码:

var dictNinjas = Regex.Matches(priceListValue, @"\*(\w+)=(a-zA-Z)|\*(\$(0-9))").Cast<Match>()
                                        .ToDictionary(x => x.Groups[0].Value,
                                                      x => x.Groups[1].Value);

我的理解是,首先会用字母a-zA-Z搜索所有单词,然后所有值都位于$符号之后。 | symbol是分组,因此第一个参数是第0组,第二个参数是第1组。但这不起作用。

任何人都可以帮助我吗?我正在努力了解如何使这项工作,谢谢。

2 个答案:

答案 0 :(得分:1)

Groups[0].Value是完整匹配,因此您需要12

var dictNinjas = Regex.Matches(str, @"""(\w+) - \$([\d.]+)").Cast<Match>()
                                    .ToDictionary(x => x.Groups[1].Value,
                                                  x => x.Groups[2].Value);

Groups[1].Value是指正则表达式中第一个()中捕获的内容,第二个是`Groups[2].Value

我不确定为什么你的正则表达式中有=,但看起来你在路上误解了一些东西。

答案 1 :(得分:1)

首先:

  

所以第一个参数是第0组,第二个参数是   第1组

  • 组0是整个匹配的字符串
  • 第1组是连接到第一个关闭括号的组。

别担心,这是一个常见的错误。

此网站有一个very handy regex tester tool以及大量的RE信息 - 请记住,当您将正则表达式搜索字符串放入C#时,您可能需要转义更多字符,并且逐字逐句可能无法正确解释。

例如:我将(\w+) - \$(\d+\.\d{2})作为我的RE字符串并获取:

  

第一场比赛:莱昂纳多 - 第24位$ 0.99   反向引用:$ 1 = Leonardo $ 2 = 0.99   其他比赛:   发现:Donatello - 位置217美元0.25美元   发现:Raphael - 位置369美元0.15美元   发现:米开朗基罗 - 位置566美元0.14美元