0

ファイル内の正規表現のすべての一致を見つけて置き換えようとしています。複数のステップで一致を見つけたいと思います。たとえば、最初に 2 つの $IDENTIFIER_ の間にあるパターンを見つけ、そのパターン内ですべての $ONE を $TWO に置き換えます。

これは私がこれまでに持っているものです:

$entireFile = "Some random text here var_a 4456 var_b var_c 1122 var_d var_e 559 var_f Some random text here ";
my $ONE_="1";
my $TWO_="2";
my $IDENTIFIER_ =  "\\b[a-zA-Z_][a-zA-Z0-9_]*\\b";
my $id1;
my $id2;
my $item;
while ($entireFile =~ m/($IDENTIFIER_)(.*?)($IDENTIFIER_)/g)
{
  $id1  = $1; 
  $item = $2;
  $id2  = $3;
  #Check to see if $item has $ONE and replace with $TWO
  if ($item =~ s/(.*?)$ONE_(.*?)/$1$TWO_$2/g )
  {
    print $id1.$item.$id2."\n" ;
  }
}

これは以下を出力します:

var_c 2222 var_d

私が助けを必要としているのは、ファイルの残りの部分 (最初の一致の前のテキスト、次の一致の間のテキスト、最後の一致の後のテキスト) を印刷する方法です。

4

2 に答える 2

2
$entireFile = "Some random text here var_a 4456 var_b".
              " var_c 1122 var_d var_e 559 var_f Some random text here ";
my $ONE_="1";
my $TWO_="2";
my $re_id = qr/\b[a-zA-Z_][a-zA-Z0-9_]*/;
while ($entireFile =~ s/($re_id.*?)$ONE_(.*?$re_id)/$1$TWO_$2/) { } 
print $entireFile;

本当に 2 段階で一致させたい場合は、次のようにします。

$entireFile = "Some random text here var_a 4456 var_b".
              " var_c 1122 var_d var_e 559 var_f Some random text here ";
my ($ONE_, $TWO_) = ("1", "2");
my $re_id = qr/\b[a-zA-Z_][a-zA-Z0-9_]*/;
my $printed=0;
while ($entireFile =~ /($re_id)(.*?)($re_id)/g) {
  my ($id1, $item, $id2) = ($1, $2, $3);
  my ($start, $end, $length) = ($-[0], $+[0], $+[0]-$-[0]);
  if ($printed < $start) {
    print substr($entireFile, $printed, $-[0]-$printed);
    $printed = $start;
  }
  if ($item =~ s/(.*?)$ONE_(.*?)/$1$TWO_$2/g ) { 
    print $id1.$item.$id2."\n" ;
    $printed = $end;
  } else {
    print substr($entireFile, $printed, $length)."\n";
    $printed = $end;
  }
}
于 2012-08-20T20:03:22.787 に答える
0

1 つの方法は、置換内で実行する関数を使用することです。

例えば

$entireFile = "Some random text here var_a 4456 var_b var_c 1122 var_d var_e 559 var_f Some random text here ";
my $ONE_="1";
my $TWO_="2";
my $IDENTIFIER_ =  "\\b[a-zA-Z_][a-zA-Z0-9_]*\\b";

$entireFile =~ s/($IDENTIFIER_)(.*?)($IDENTIFIER_)/$1 . inner_func($2) . $3/egs;
print( $entireFile );

sub inner_func {
    my ( $text ) = @_;

    $text =~ s/$ONE_/$TWO_/g;
    return( $text );
}

フラグは/e、置換演算子 ( s///) に、置換テキストをコードであるかのように実行するように指示します。これは、再帰的降下解析に特に役立ちます...

置換のフラグとして使用する場合/sは、検索と置換に改行を他の文字と同様に扱うように指示することにもなります - このグローバルな置換を複数行にわたって実行できるようにします (ファイル全体を最初の場所)。

于 2012-08-20T21:06:17.350 に答える