Regex новичок вопрос о начале и конце захвата - PullRequest
1 голос
/ 20 августа 2009

Мне нужна помощь с регулярными выражениями. Пожалуйста, смотрите пример ниже. Я записываю конкретные значения избавления, которые содержатся между этим

","children":[

и заканчивается этим

 
}]}]}

как показано ниже.

Моя проблема в том, что показанный ниже блок повторяется несколько раз, и я хочу, чтобы все поездки между началом ","children":[ to }]}]} были только для одного блока.

Я знаю, что могу получить индивидуальное значение рида с помощью: rid":"([\w\d\-\."]+)

Но я не знаю, как указать, чтобы захватить все rid":"([\w\d\-\."]+), которые существуют между началом ","children":[ до }]}]}

Пример:

     ","children":[{"type":"stub","context":"","rid":"b1c4922237ce.ee6a3644443fe.10711226e93.d0af7aadbd0-4be3-4353ddd.8b47.f2f4aaf2474f","metaclass":"ASAPModel.BarrierCategory"},
{"type":"stub","context":"","rid":"b1c497ce.ee6a64fe.290c6e93.91c15f91-a1c-4c36.9939.4ab7b94a39ad","metaclass":"ASAPModel.BarrierCategory"},
{"type":"stub","context":"","rid":"b1c497ce.ee6a64fe.27c3ee93.22e90c22-7406-463a.8bff.f6ea88f6ffcc","metaclass":"ASAPModel.BarrierCategory"},
{"type":"stub","context":"","rid":"b1c497ce.ee6a64fe.6a182e93.5c0e7d5c-ff65-451d.afc0.cfc7fbcfc02d","metaclass":"ASAPModel.BarrierCategory"},
{"type":"stub","context":"","rid":"b1c497ce.ee6a64fe.6970ae93.8ea3978e-112b-4bbb.8405.d17071d105d2","metaclass":"ASAPModel.BarrierCategory"}]}]},

     ","children":[{"type":"stub","context":"","rid":"b1c4922237ce.ee6a3644443fe.10711226e93.d0af7aadbd0-4be3-4353ddd.8b47.f2f4aaf2474f","metaclass":"ASAPModel.BarrierCategory"},
{"type":"stub","context":"","rid":"b1c497ce.ee6a64fe.290c6e93.91c15f91-a1c-4c36.9939.4ab7b94a39ad","metaclass":"ASAPModel.BarrierCategory"},
{"type":"stub","context":"","rid":"b1c497ce.ee6a64fe.27c3ee93.22e90c22-7406-463a.8bff.f6ea88f6ffcc","metaclass":"ASAPModel.BarrierCategory"},
{"type":"stub","context":"","rid":"b1c497ce.ee6a64fe.6a182e93.5c0e7d5c-ff65-451d.afc0.cfc7fbcfc02d","metaclass":"ASAPModel.BarrierCategory"},
{"type":"stub","context":"","rid":"b1c497ce.ee6a64fe.6970ae93.8ea3978e-112b-4bbb.8405.d17071d105d2","metaclass":"ASAPModel.BarrierCategory"}]}]},

Моя проблема в том, что я не понимаю, как указать начальные и конечные значения того, где начинать группу без захвата, и как сказать, идентифицировать одну или несколько из этих групп захвата, вроде []+

Ответы [ 3 ]

6 голосов
/ 20 августа 2009

Это выглядит как JSON (хотя данные в вашем примере неполны, чтобы быть действительными).

Если это так, то, возможно, JSON модуль из CPAN может быть лучшим путем вперед:

use strict;
use warnings;
use JSON qw( from_json );

# my example data
my $data = q( [ 
    {"children":[ {"type":"stub","rid":"aa"}, {"type":"stub2","rid":"bb"} ] }, 
    {"children":[ {"type":"stub","rid":"cc"}, {"type":"stub2","rid":"dd"} ] } ]
);

my $json = from_json( $data );

for my $rec ( @$json ) {
    for my $child ( @{ $rec->{children} } ) {
        say "rid: ", $child->{rid};
    }
}

Это печатает:

rid: aa
rid: bb
rid: cc
rid: dd
1 голос
/ 20 августа 2009

Вы должны разбить это на два шага:

  1. Получить длину данных
  2. Получить RID

    # Make sure you get the first one
    my ( $child ) = $record =~ m/"children":\[([^\]]+)\]/g;
    # Get all in span - the g operator tells the regex to get all ( 'global' )
    my @rids     = $child =~ m/"rid":"([^"]+)"/g; # <-- g operator
    

Но для меня это выглядит как JSON, и вы можете анализировать данные следующим образом: JSON :: Syck

0 голосов
/ 20 августа 2009

что-то вроде \",\"children\":(.*)(?=\\]\\}\\]\\})

тренируйся с ним

форум поглощает некоторые из моих обратных слешей, предупреждающее слово, чтобы удвоиться для всех остальных

в ответ на правки

Попробуйте сначала разбить данные на группы в скобках, а затем выполнить один поиск для каждого в цикле for. Вы можете получить все группы одновременно, используя группы регулярных выражений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...