0

以下のような文字列があります

atom:link[@me="samiron" and @test1="t1" and @test2="t2"]

そして、次の後方参照を生成する正規表現が必要です

#I would prefer to have
$1 = @test1
$2 = t1
$3 = @test2
$4 = t2

#Or at least. I will break these up in parts later on.
$1 = @test1="t1"
$2 = @test2="t2"

私は( and [@\w]+=["\w]+)*\]ラストマッチのみを返すようなものを試しましand @test2="t2"た。完全にアイデア不足。何か助けはありますか?

編集: 実際には@test1="t1"パターンの数は固定されていません。そして、正規表現は状況に適合する必要があります。Thnx @Pietzcker。

4

4 に答える 4

1

あなたはこのようにそれを行うことができます:

my $text = 'atom:link[@me="samiron" and @test1="t1" and @test2="t2"]';
my @results;
while ($text =~ m/and (@\w+)="(\w+)"/g) {
  push @results, $1, $2;
}
print Dumper \@results;

結果:

$VAR1 = [
          '@me',
          'samiron',
          '@test1',
          't1',
          '@test2',
          't2'
        ];
于 2012-10-19T07:31:26.087 に答える
1

これにより、「@test1」=>「t1」などをマップするハッシュが得られます。

my %matches = ($str =~ /and (\@\w+)="(\w+)"/g);

説明: /g グローバル マッチは、"@test1"、"t1"、"@test2"、"t2" などのマッチの配列を提供します。

ハッシュ %matches がこの配列に割り当てられると、perl は配列をキーと値のペアとして扱うことにより、自動的に配列をハッシュに変換します。その結果、ハッシュ %matches には、探しているものが適切なハッシュ形式で含まれます。

于 2012-10-19T07:34:53.860 に答える
0

これは私のために働く:

@result = $s =~ /(@(?!me).*?)="(.*?)"/g;
foreach (@result){
    print "$_\n";
}

出力は次のとおりです。

@test1
t1
@test2
t2
于 2012-10-19T10:34:41.113 に答える
0

繰り返しキャプチャ グループを使用すると、新しい一致ごとに以前の一致が上書きされます。

したがって、次のような正規表現でのみ「すべてを検索」できます

@result = $subject =~ m/(?<= and )([@\w]+)=(["\w]+)(?= and |\])/g;

すべての一致の配列を取得します。

于 2012-10-19T07:33:49.880 に答える