使用regex从字符串构建字典

本文关键字:构建 字典 字符串 regex 使用 | 更新日期: 2023-09-27 18:10:14

假设我有这样一个字符串:

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

所以我已经读了很多关于regex的几天,我不知道它是如何工作的。到目前为止,我有这行代码:

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。但这行不通。

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

使用regex从字符串构建字典

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是指regex中第一个()捕获的内容,第二个`Groups[2].Value捕获的内容。

我不知道为什么你有一个=在你的正则表达式,但t看起来你已经误解了一些东西。

first:

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

  • 组0是整个匹配字符串
  • 组1是连接到第一个右括号的组。
别担心,这是常犯的错误。

这个站点有一个非常方便的正则表达式测试工具,以及大量的正则信息-只要记住,当你把你的正则表达式搜索字符串到c#中,你可能需要转义更多的字符,逐字逐句可能无法正确解释。

例如:我插入('w+) - '$('d+'.'d{2})作为我的正则字符串,并得到:

第一场比赛:莱昂纳多- 0.99美元,第24位背景资料:1美元=莱昂纳多2美元= 0.99美元额外的匹配:发现:多纳泰罗- $0.25,位置217发现:拉斐尔- $0.15,位置369发现:米开朗基罗- $0.14在第566位