如何从多行字符串中提取多个模式

时间:2011-10-06 17:52:59

标签: regex perl multiline

我有一个看起来像这样的字符串。它显然是一个多行字符串,我想将它分成每个节的一个字符串。

{
   "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

3 个答案:

答案 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/;