0

私はこれらのようなデータを持っています:

a{b}cde
a{b}c{d}e

文字列を3つの部分にこぼしたいと思います。

  1. 最初の{}ペアの前の文字列
  2. 最初の{}ペアの文字列
  3. 残り

これが私のコードです:

if(/(.*){(.*)}(.*)/){
    print "$1\t$2\t$3\n";  # ===> a{b}c   d       e
}

しかし、それはのために動作しませんa{b}c{d}e

a b c{d}e代わりに欲しいa{b}c d e

4

2 に答える 2

3

。*を貪欲でない(。*?)にすると、トリックが実行されます。

#!/usr/bin/perl
use strict;
use warnings;

while (my $line = <DATA>) {
    if($line =~ m/(.*?){(.*?)}(.*)/){
    print "$1\t$2\t$3\n";
    }
}

__DATA__
a{b}cde
a{b}c{d}e
于 2013-03-27T07:43:48.420 に答える
1

この場合、貪欲でない一致は機能しますが、代わりに否定された文字クラスを使用することをお勧めします。}これは、文字の後に続く文字の可能な限り短いシーケンスではなく、一連の非文字が必要であることをより明確に示しています}

#!/usr/bin/env perl    

use strict;
use warnings;
use 5.010;

while (<DATA>) {
  say "$1\t$2\t$3" if /^([^{]*){([^}]*)}(.*)/;
} 

__DATA__
a{b}cde
a{b}c{d}e
于 2013-03-27T08:19:46.070 に答える