1

假设我有这个字符串:

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]]};

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

核心价值

莱昂纳多 \ 0.99

多纳泰罗 \ 0.25

拉斐尔 \ 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 的单词,然后查找位于 $ 符号之后的所有值。该| 符号是分组,所以第一个参数是组 0,第二个参数是组 1。但这不起作用。

谁能帮我吗?我正在努力理解如何使这项工作,谢谢。

4

2 回答 2

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第二个。

我不确定为什么你=的正则表达式中有 a 但 t 看起来你在此过程中误解了一些东西。

于 2013-04-19T16:27:46.713 回答
1

首先:

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

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

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

这个站点有一个非常方便的正则表达式测试工具以及大量 RE 信息 - 请记住,当您将正则表达式搜索字符串放入 C# 时,您可能需要转义更多字符,并且逐字可能无法正确解释。

例如:我将其插入(\w+) - \$(\d+\.\d{2})为我的 RE 字符串并得到:

第一场比赛:Leonardo - 24 位 0.99 美元 反向引用:1 美元 = Leonardo 2 美元 = 0.99 其他比赛:找到:Donatello - 217 位 0.25 美元 找到:Raphael - 369 位 0.15 美元 找到:米开朗基罗 - 566 位 0.14 美元

于 2013-04-19T16:31:49.813 回答