次の文字列を取得して、チャンクに分割する必要があります。
[ToNode = cup-subscriber][Reason=クリティカルサービスがダウンしています][FromNode= cup-publisher] [AppID = Cisco UP Server Recovery Manager]
各チャンクは角かっこで囲まれています。私はこれをPerlで行うことを考えており、メソッドの方向性を探しています。
ありがとう!
正規表現には /g 修飾子を使用します。リストコンテキストで配列に抽出します:
$data = "[ToNode=cup-subscriber][Reason=Critical service is down][FromNode=cup-publisher][AppID=Cisco UP Server Recovery Manager]"
my @chunk = ( $data =~ /\[(.*?)\]/g );
または while ループでチャンクを反復処理します。
$data = "[ToNode=cup-subscriber][Reason=Critical service is down][FromNode=cup-publisher][AppID=Cisco UP Server Recovery Manager]"
while ( $data =~ /\[(.*?)\]/g ) {
process($1);
}
先読みアサーションと後読みアサーションを使用して、]
と の間のポイントで分割できます。[
$str = '[ToNode=cup-subscriber][Reason=Critical service is down]
[FromNode=cup-publisher][AppID=Cisco UP Server Recovery Manager]';
@pieces = split/(?<=\])(?=\[)/,$str;
これを試して:
my $str = '[ToNode=cup-subscriber][Reason=Critical service is down][FromNode=cup-publisher][AppID=Cisco UP Server Recovery Manager]';
my %fields = $str =~ m{\[([^][=]+)=([^][=]+)\]}g;
say "$_: $fields{$_}" for sort keys %fields;
またはより詳細に:
my $str = '[ToNode=cup-subscriber][Reason=Critical service is down][FromNode=cup-publisher][AppID=Cisco UP Server Recovery Manager]';
# Capture all occurrences of ...
my %fields = $str =~ m{
\[ # Open bracket
( [^][=]+ ) # Sequence of 1 or more non ][= characters
= # Equals
( [^][=]+ ) # Sequence of 1 or more non ][= characters
\] # Close bracket
}xg;
# Dump contents of %fields
say "$_: $fields{$_}" for sort keys %fields;