我有一个看起来像这样的字符串。它显然是一个多行字符串,我想将它分成每个节的一个字符串。
{
"timestamp":1317911700,
"application":"system.dev",
"metrics":{
"qlen":0,
"read.bytes":0,
"write.bytes":185165.0123762,
"busy":0.021423
},
"dimensions":{
"device":"sda"
}
}
{
"timestamp":1317911700,
"application":"system.fs",
"metrics":{
"inodes.used":246627,
"inodes.free":28703901,
"capacity.kb":227927024,
"available.kb":209528472,
"used.kb":6820512
},
"dimensions":{
"filesystem":"/"
}
}
{
"status_code":0,
"application":"system",
"status_msg":"Data collected successfully"
}
我的正则表达式如下:
/^({\n[^}]+^})/m
但我只是在捕捉:
{
"status_code":0,
"application":"system",
"status_msg":"Data collected successfully"
}
哪种有意义,因为那是第一个大括号的位置。我想要做的是从任何地方捕获/ ^ {/到任何地方有/ ^} /作为单个字符串。但我认为那里的其他花括号是tr
答案 0 :(得分:4)
我可以想到几种方法。
perlre中有一个关于如何实现递归模式的示例。这很难。你需要考虑字符串中的curlies。
Text::Balanced已经提供了匹配平衡的parens(包括curlies)的方法。这可能会更容易,因为我认为它可以考虑字符串中的curlies。
看起来您可以简单地拆分空白行。
@json_snippets = split /^$/m, $json_snippets;
但最可靠的解决方案是使用JSON::XS的“增量解析器”。 (在其文档中搜索。)
答案 1 :(得分:1)
for my $stanza (split /^$/m, $str) {
...
}
答案 2 :(得分:0)
如果您无法使用JSON解析器正确执行此操作,我只会在节的末尾拆分。
my @stanzas = split /^}\K\n\n/;