当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《用于解析JSON对象数组的正则表达式?》经验,为你挑选了3个好方法。

我正在尝试将一组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:\[(?[^\]]*)\]\}"
                                 , RegexOptions.ExplicitCapture);
Regex arrayParser = new Regex(@"((?\{[^\}]\}),?)+"
                                 , RegexOptions.ExplicitCapture);

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

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

不管这份名单是一个string[]数组或一个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:\[(?[^\]]*)\]\}"
                                 , RegexOptions.ExplicitCapture);
Regex arrayParser = new Regex(@"((?\{[^\}]\}),?)+"
                                 , 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;

任何人都可以看到我做错了吗?我完全坚持这个.



1> 小智..:

平衡括号实际上是无法使用正则表达式处理的语言的教科书示例.JSON基本上是平衡括号加上一堆其他东西,括号替换为parens.在形式语言的层次结构中,JSON是一种无上下文的语言.正则表达式无法解析无上下文语言.

有些系统提供正则表达式的扩展,有点处理平衡表达式.然而,它们都是丑陋的黑客,它们都是不可移植的,而且它们最终都是错误的工具.

在专业工作中,您几乎总是使用现有的JSON解析器.如果你想为了教育目的而自己动手,那么我建议从一个支持+ - */()的简单算术语法开始.(JSON有一些逃避规则,虽然不复杂,但会使你的第一次尝试比它需要的更难.)基本上,你需要:

    将语言分解为符号字母

    根据识别语言的符号编写无上下文语法

    将语法转换为乔姆斯基普通形式,或接近足以使步骤5变得容易

    编写一个将原始文本转换为输入字母表的词法分析器

    编写一个递归下降解析器,它获取词法分析器的输出,解析它,并产生某种输出

这是几乎所有大学的典型的第三年CS任务.

下一步是找出在递归解析器中触发堆栈溢出所需的JSON字符串的复杂程度.然后看看可以编写的其他类型的解析器,你就会明白为什么必须在现实世界中解析无上下文语言的人使用像yacc或antlr这样的工具而不是手工编写解析器.

如果这比您正在寻找的学习更多,那么您应该随意使用现成的JSON解析器,满意您学到了一些重要且有用的东西:正则表达式的限制.



2> 小智..:

平衡括号实际上是无法使用正则表达式处理的语言的教科书示例

bla bla bla ...看看这个:

arrayParser = "(?[\w]+)":"?(?([\s\w\d\.\\\-/:_]+(,[,\s\w\d\.\\\-/:_]+)?)+)"?

这对我有用

如果你想匹配空值,最后将'+'改为'*'



3> casperOne..:

你在使用.NET 3.5吗?如果是这样,您可以使用它DataContractJsonSerializer来解析它.没有理由自己这样做.

如果您不使用.NET 3.5,则可以使用Jayrock.


通过使用System.Web.Extensions程序集和System.Web.Script.Serialization命名空间安装ASP.NET 2.0 AJAX Extensions 1.0,也可以在.NET 2.0中使用JavaScriptSerializer
推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有