0

質問1

dc_abcパターンを一致させて、に置き換えたいのですdc_ABCが、パターンがまたはの場合.dc_abc"dc_abc"同じままである必要があります。

入力ファイル:

.dc_abc (dc_abc);
.dc_abc({dc_abc});
dc_abc("dc_abc");

Output_file:

.dc_abc (dc_ABC);
.dc_abc({dc_ABC});
dc_ABC("dc_abc");

質問2

次のような2つの配列を作成できる方法はPerlにありますか?

@match_pattern =(!dc_abc , dc_abc: ,dc_abc );
@ignore_pattern = (.dc_abc, {dc_abc});
  • パターンがに属している場合は@match_pattern、に置き換えdc_ABCます。
  • パターンがに属する場合は@ignore pattern、何もしないでください。

入力ファイル:

.dc_abc(dc_abc, {dc_abc});
!dc_abc(!dc_abc);
dc_abc: (dc_abc:);

出力ファイル:

.dc_abc(dc_ABC , {dc_abc});
!dc_abc(dc_ABC);
dc_ABC (dc_ABC);
4

1 に答える 1

2

ネガティブルックアラウンドを使用して、アサーションを照合できます。一致させたい部分がリテラルのドットまたは引用符の後に続くことができないことを正規表現に伝えることができます。その(?<! )部分はネガティブな後ろ姿です。その中に、パターンがあります[."]。これは、パターンの残りの部分に先行できない文字を含む文字クラスです。

use v5.10;

while( <DATA> ) {
    chomp;
    s/(?<![\."])dc_abc/dc_ABC/g;
    say;
    }


__END__
.dc_abc (dc_abc);
.dc_abc({dc_abc});
dc_abc("dc_abc");

これは与える:

.dc_abc (dc_ABC);
.dc_abc({dc_ABC});
dc_ABC("dc_abc");

ルックアラウンドはどの文字とも一致せず、Perlのネガティブルックビハインドは固定幅である必要があります(したがって、数量詞はありません)。

質問2の場合、Perlにはそれを実行するために必要なすべてのツールがあり、ロジックを完成させるのはあなたに任されています。でも、夜遅くまで考える気は特にありません。多分後で何かを考えるでしょう。それに対処するためのさまざまなブルートフォース攻撃の方法がありますが、おそらく何か賢いものがあります。

于 2012-08-07T03:44:05.813 に答える