当前位置: 首页 > 面试题库 >

正则表达式解析JSON对象数组?

穆理
2023-03-14
问题内容

我正在尝试将JSON对象数组解析为C#中的字符串数组。我可以从JSON对象提取数组,但不能将数组字符串拆分为单个对象的数组。

我有这个测试字符串:

string json = "{items:[{id:0,name:\"Lorem Ipsum\"},{id:1,name" 
            + ":\"Lorem Ipsum\"},{id:2,name:\"Lorem Ipsum\"}]}";

现在,我现在正在使用以下正则表达式将项目拆分为单个对象。现在,它们是2个单独的正则表达式,直到我解决第二个正则表达式为止:

Regex arrayFinder = new Regex(@"\{items:\[(?<items>[^\]]*)\]\}"
                                 , RegexOptions.ExplicitCapture);
Regex arrayParser = new Regex(@"((?<items>\{[^\}]\}),?)+"
                                 , RegexOptions.ExplicitCapture);

arrayFinder正则表达式的工作,我期望它,但对于原因,我不明白的方式,arrayParser正则表达式不会在所有的工作。我要做的就是将各个项目拆分成自己的字符串,这样我就得到了一个列表:

{id:0,name:"Lorem Ipsum"}
{id:1,name:"Lorem Ipsum"}
{id:2,name:"Lorem Ipsum"}

这个列表是string[]数组还是a
GroupMatch集合都没有关系,但是我对如何拆分对象感到困惑。使用上面声明的arrayParserjson字符串,我尝试了以下代码,我认为该代码可以正常使用:

string json = "{items:[{id:0,name:\"Lorem Ipsum\"},{id:1,name" 
            + ":\"Lorem Ipsum\"},{id:2,name:\"Lorem Ipsum\"}]}";

Regex arrayFinder = new Regex(@"\{items:\[(?<items>[^\]]*)\]\}"
                                 , RegexOptions.ExplicitCapture);
Regex arrayParser = new Regex(@"((?<items>\{[^\}]\}),?)+"
                                 , RegexOptions.ExplicitCapture);

string array = arrayFinder.Match(json).Groups["items"].Value;
// At this point the 'array' variable contains: 
// {id:0,name:"Lorem Ipsum"},{id:1,name:"Lorem Ipsum"},{id:2,name:"Lorem Ipsum"}

// I would have expected one of these 2 lines to return 
// the array of matches I'm looking for
CaptureCollection c = arrayParser.Match(array).Captures;
GroupCollection g = arrayParser.Match(array).Groups;

有人可以看到我在做什么错吗?我完全被这个困扰。


问题答案:

括号在字面上是一种教科书示例,该语言无法使用正则表达式进行处理。JSON本质上是平衡的圆括号,外加大量其他内容,用括号替换了括号。在正式语言的层次结构中,JSON是一种无上下文的语言。正则表达式无法解析无上下文的语言。

某些系统提供了对正则表达式的扩展,这种正则表达式可以处理平衡表达式。但是,它们都是丑陋的骇客,它们都是不可移植的,并且最终都是工作的错误工具。

在专业工作中,您几乎总是会使用现有的JSON解析器。如果您想出于教育目的滚动自己的语言,那么我建议从支持+-*
/()的简单算术语法开始。(JSON具有一些转义规则,这些规则虽然并不复杂,但会使您的第一次尝试变得比所需的困难。)基本上,您需要:

  1. 将语言分解为符号字母
  2. 根据识别语言的符号编写无上下文语法
  3. 将语法转换为Chomsky范式,或将其转换为足以使第5步容易的程度
  4. 编写将原始文本转换为输入字母的词法分析器
  5. 编写一个递归下降解析器,该解析器获取词法分析器的输出,进行解析,并产生某种输出

这是几乎任何一所大学都典型的三年级CS任务。

下一步是找出递归解析器中触发堆栈溢出所需的JSON字符串有多复杂。然后查看可以编写的其他类型的解析器,您将了解为什么在现实世界中任何必须解析上下文无关语言的人都使用yacc或antlr之类的工具而不是手动编写解析器。

如果这比您期望的要多,那么您应该随便使用一个现成的JSON解析器,这满足了您学到了一些重要和有用的知识:正则表达式的限制。



 类似资料:
  • Java中的正则表达式问题。我正在从元素href属性中提取Id号。我在一个字符串中有一堆这样的链接:

  • 问题内容: 有什么方法可以在python中的流上使用正则表达式匹配吗?喜欢 而且我不想通过获取整个字符串的值来做到这一点。我想知道是否有任何方法可以在srtream上匹配正则表达式(即时)。 问题答案: 我有同样的问题。首先想到的是实现一个类,该类的作用类似于字符串,但仅从流中读取当前所需的数据(我通过重新实现并提取和缓冲字符直到访问的最高位置来完成此操作……)。 这没有解决(我从中得到了“ Ty

  • 问题内容: 我正在创建一个CSS编辑器,并试图创建一个可以从CSS文档获取数据的正则表达式。如果我拥有一个属性,则此正则表达式有效,但我无法使其对所有属性都有效。我在PHP中使用preg / perl语法。 正则表达式 测试用例 预期结果 实际结果 在此先感谢您的帮助-整个下午使我感到困惑! 问题答案: 对于单个正则表达式来说,这似乎太令人费解了。好吧,我敢肯定,通过正确的扩展,高级用户可以创建正

  • 我试图在正则表达式中组合if-else,基本上,如果字符串中存在一些模式,则捕获一个模式,如果不存在,则捕获另一个模式。 字符串是:'https://www.searchpage.com/searchcompany.aspx?companyId=41490234 因此,如果在字符串中检测到“?”,则正则表达式应捕获“?”标记之后的所有内容;如果没有,那就从头抓起。 我使用了:

  • 问题内容: 我正在实现某种解析器,我需要定位并反序列化 嵌入到其他半结构化数据中的 json对象。我用了regexp: 定位物体 但不适用于嵌套对象,因为表达式仅匹配第一个找到的右花括号。对于 它匹配 因此字符串对于反序列化变得无效。我知道有一个贪婪的业务正在考虑中,但是我对正则表达式并不熟悉。您能否帮助我扩展表达式以使用所有可用的大括号。 更新: 明确地说,这是尝试从具有嵌入式JSON的半结构化

  • 本文向大家介绍python正则表达式re之compile函数解析,包括了python正则表达式re之compile函数解析的使用技巧和注意事项,需要的朋友参考一下 re正则表达式模块还包括一些有用的操作正则表达式的函数。下面主要介绍compile函数。 定义: compile(pattern[,flags] ) 根据包含正则表达式的字符串创建模式对象。 通过python的help函数查看compi