说我有这个字符串:
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组。但这不起作用。
任何人都可以帮助我吗?我正在努力了解如何使这项工作,谢谢。
答案 0 :(得分:1)
Groups[0].Value
是完整匹配,因此您需要1
和2
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组
别担心,这是一个常见的错误。
此网站有一个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美元