正则表达式匹配嵌套的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库(我是Cyberneko for Java的忠实粉丝),这使得我们可以轻松地专注于
块。
- 您的JSON解析库需要在发现错误时立即停止使用流中的字符,并且当它发生时它不需要关闭流。
一旦你找到第一个{
,寻找匹配的一个(一个简单的计数器,只要你找到一个递增的{
,当你找到一个递减时}
应该做的诀窍)。 尝试将生成的字符串解析为JSON。 迭代直到它工作或你已经用完了可能的块。
这是丑陋的,hackish,永远不应该成为生产代码。 我得到的印象是你只需要批量工作,这就是为什么我甚至建议它。