簡體   English   中英

如何從多行字符串中提取多個模式

[英]How to extract multiple patterns from a multi-line string

我有一個看起來像這樣的字符串。 顯然,它是多行字符串,我想在每個節中將其拆分為一個字符串。

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

有點意思,因為那是第一個大括號所在的位置。 我想做的是將/ ^ {/的任何地方捕獲為/ ^} /作為單個字符串。 但我認為其中的其他花括號

我可以想到幾種方法。

  • perlre的某個地方有一個示例, 說明如何實現遞歸模式。 這很難。 您需要考慮串中的冰壺。

  • Text :: Balanced已經提供了匹配平衡的parren(包括冰壺)的方法。 這可能會更容易,因為我認為它可以考慮字符串中的卷曲。

  • 看來您可以簡單地在空白行上分割。

     @json_snippets = split /^$/m, $json_snippets; 
  • 但是最可靠的解決方案是使用JSON :: XS的“增量解析器”。 (在其文檔中搜索。)

for my $stanza (split /^$/m, $str) {
  ...
}

如果您不能使用JSON解析器正確執行此操作,那么我將在節的末尾拆分。

my @stanzas = split /^}\K\n\n/;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM