2013-07-22 152 views
2

我正在实现某种解析器,我需要定位和反序列化嵌入到其他半结构化数据的json对象。我用正则表达式:正则表达式匹配嵌套的json对象

\\{\\s*title.*?\\} 

定位对象

{title:'Title'} 

但因为表达式匹配只有第一发现闭花括号它不与嵌套对象。对于

{title:'Title',{data:'Data'}} 

它匹配

{title:'Title',{data:'Data'} 

这样的字符串成为反序列化无效。 我知道有一个贪婪的企业会考虑到,但我不熟悉正则表达式。你能帮我扩展表达式来消耗所有可用的大括号。

更新:

需要明确的是,这是一个试图从具有嵌入的JSON像HTML + JS半结构化数据提取JSON数据。我使用GSon JAVA库来实际解析提取的JSON。

+0

小心“OMG,不要使用正则表达式”! – SmokeyPHP

+0

..但一切都很严肃 - 为什么?什么是数据,你需要做什么 – SmokeyPHP

+3

@ViktorStolbin有预制的JSON解析库。另外,由于JSON不是常规语言,因此无法用正则表达式正确解析(就像HTML一样)。 –

回答

1

感谢@Sanjay T. Sharma指出我“支持配对”,因为我最终对贪婪的表达有了一些理解,也感谢别人最初说我不应该做的事情。 好在事实证明这是确定使用表达

\\{\s*title.*\\} 

的贪婪变种因为右括号之间没有非JSON数据。

3

正如其他人所建议的,一个成熟的JSON解析器可能是一条可行的路。如果你想匹配,你有上述简单的例子键值对,你可以使用:

(?<=\{)\s*[^{]*?(?=[\},]) 

对于输入字符串

{title:'Title', {data:'Data', {foo: 'Bar'}}} 

这符合:

1. title:'Title' 
2. data:'Data' 
3. foo: 'Bar' 
+0

我应该试试!谢谢! –

0

这绝对是可怕的,我不敢相信我实际上把我的名字放在这个解决方案中,但是你能不能找到第一个{这个字符在Javascript块中,并试图通过适当的JSON解析库解析剩余的字符?如果它有效,你有一场比赛。如果没有,请继续阅读,直到下一个{角色重新开始。

有一些问题存在,但他们或许可以被周围的工作:

  • 你需要能够识别的Javascript块。大多数语言都具有HTML到DOM库(我是用于Java的Cyberneko的粉丝),因此可以轻松专注于<script>...</script>块。
  • 您的JSON解析库需要在流发现错误时立即停止使用流中的字符,并且在它发生错误时它不需要关闭流。

的改进是,一旦你找到了第一{,寻找匹配}一个(一个简单的计数器,每当你找到一个{是递增和递减,当你发现一个}应该做的伎俩)。尝试将结果字符串解析为JSON。迭代直到它工作,或者你已经跑出了可能的块。

这是丑陋的,骇人听闻的,不应该让它生产代码。不过,我觉得你只需要一个批处理作业就可以了,这就是我为什么要这么做的原因。

+0

没错。这很丑陋,并且不易实施。 –