Как извлечь несколько шаблонов из многострочной строки - PullRequest
1 голос
/ 06 октября 2011

У меня есть строка, которая выглядит следующим образом. Это, очевидно, многострочная строка, и я хотел бы разбить ее на одну строку в строфе.

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

4 голосов
/ 06 октября 2011

Я могу вспомнить несколько подходов.

  • Где-то в perlre есть пример того, как вы можете реализовать рекурсивный шаблон.Это трудно.Вам необходимо учитывать curly в строках.

  • Text :: Balanced уже предоставляет средства для сопоставления сбалансированных слов (включая curlies).Это может быть проще, потому что я думаю, что это может учитывать curly в строках.

  • Похоже, вы можете просто разбить на пустые строки.

    @json_snippets = split /^$/m, $json_snippets;
    
  • Но самое надежное решение - использовать JSON :: XS «инкрементный синтаксический анализатор».(Ищите это в своей документации.)

1 голос
/ 06 октября 2011
for my $stanza (split /^$/m, $str) {
  ...
}
0 голосов
/ 06 октября 2011

Если вы не можете использовать синтаксический анализатор JSON для правильного выполнения этого, я просто разделю его в конце строфы.

my @stanzas = split /^}\K\n\n/;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...