正则表达式匹配嵌套的json对象

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

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

找到对象

 {title:'Title'} 

但它不适用于嵌套对象,因为表达式仅匹配第一个找到的右括号。 对于

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

它匹配

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

所以字符串对于反序列化变得无效。 我知道有一个贪婪的业务,但我不熟悉正则表达式。 你可以帮我扩展表达式以消耗所有可用的结束花括号。

更新:

为了清楚起见,这是尝试从带有嵌入式JSON的HTML + JS等半结构化数据中提取JSON数据。 我正在使用GSon JAVA lib来实际解析提取的JSON。

正如其他人所建议的那样,一个成熟的JSON解析器可能就是这样。 如果要匹配上面的简单示例中的键值对,可以使用:

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

对于输入字符串

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

匹配:

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

感谢@Sanjay T. Sharma指出我“支持匹配”,因为我最终对贪婪的表达有了一些了解,也感谢其他人最初说我不该做的事情。 幸运的是,结果表明使用贪婪的表达变体是可以的

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

因为右括号之间没有非JSON数据。

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

那里有一些问题,但它们可能可以解决:

  • 你需要能够识别Javascript块。 大多数语言都有HTML到DOM库(我是Cyber​​neko for Java的忠实粉丝),这使得我们可以轻松地专注于块。
  • 您的JSON解析库需要在发现错误时立即停止使用流中的字符,并且当它发生时它不需要关闭流。

一旦你找到第一个{ ,寻找匹配的一个(一个简单的计数器,只要你找到一个递增的{ ,当你找到一个递减时}应该做的诀窍)。 尝试将生成的字符串解析为JSON。 迭代直到它工作或你已经用完了可能的块。

这是丑陋的,hackish,永远不应该成为生产代码。 我得到的印象是你只需要批量工作,这就是为什么我甚至建议它。