2

次の文字列を取得して、チャンクに分割する必要があります。

[ToNode = cup-subscriber][Reason=クリティカルサービスがダウンしています][FromNode= cup-publisher] [AppID = Cisco UP Server Recovery Manager]

各チャンクは角かっこで囲まれています。私はこれをPerlで行うことを考えており、メソッドの方向性を探しています。

ありがとう!

4

3 に答える 3

5

正規表現には /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);
}
于 2012-09-26T13:57:31.837 に答える
2

先読みアサーションと後読みアサーションを使用して、]と の間のポイントで分割できます。[

$str = '[ToNode=cup-subscriber][Reason=Critical service is down]
        [FromNode=cup-publisher][AppID=Cisco UP Server Recovery Manager]';

@pieces = split/(?<=\])(?=\[)/,$str;

見る

于 2012-09-26T13:59:27.153 に答える
0

これを試して:

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;
于 2012-09-26T14:51:36.963 に答える