[英]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"
}
有點意思,因為那是第一個大括號所在的位置。 我想做的是將/ ^ {/的任何地方捕獲為/ ^} /作為單個字符串。 但我認為其中的其他花括號
我可以想到幾種方法。
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.