2

コメント内で発生する場合にのみ、大きなコードベース内で単語の接尾辞を検索して置換する(しようとする)タスクがあります。コメントはすべて/*または//タイプですが、考えられるほとんどのエッジケースが含まれることが保証されています。

だから私はこれを変更したい:

/* blah blah something__suffix blah */

これに:

/* blah blah something blah */

しかし、私もこれを変更したいと思います:

// blah blah something__suffix blah 

これに:

// blah blah something blah 

この:

/*
 * blah blah something__suffix blah 
 */

これに:

/*
 * blah blah something blah 
 */

この:

/** 

// blah blah something__suffix blah 

*/

これに:

/** 

// blah blah something blah 

*/

ad nauseam(文字通り)。

当初、これはパーサータスクであると感じ、cochinelleをインストールしました。実際、コメントを解析できましたが、プリプロセッサマクロでスタックし、これを1回限りのタスクとして実行する人にとっては回避策が複雑に見えました。だから今、私は正規表現を考えています。

本当に堅牢な検索を実行し、CおよびC ++コメント内を正規表現に置き換えることについて多くのアドバイスを見つけていません(「パーサーが必要」以外)が、かなりよくテストされたperlがあるように見えることに気づきましたこれらの両方のスタイルのコメントを削除するためのperlFAQのスクリプトはここにあります。

次のように:

$/ = undef;
$_ = <>;

s#/\*[^*]*\*+([^/*][^*]*\*+)*/|//([^\\]|[^\n][\n]?)*?\n|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#defined $3 ? $3 : ""#gse;

print;

私の質問:コメントを削除する代わりに、コメントとして識別されたテキストでサフィックスを検索し、サフィックスを削除して残りのコメントをそのままにしておくことができるように、このスクリプトをどのように適合させるのですか?

4

2 に答える 2

1

これが良い解決策かどうかはわかりませんが、機能します。

use strict; use warnings; use feature qw(say);
my @lines = (
qq~Example 1:
/* blah blah something__suffix blah */~,
qq~Example 2:
// blah blah something__suffix blah needs a newline at the end
~,
qq~Example 3:
/*
 * blah blah something__suffix blah 
 */~,
qq~Example 4:
/** 

// blah blah something__suffix blah 

*/~,
qq~Example 5 (string):
foobar '// blah blah something__suffix blah '~,
qq~Example 6:
public void main { return; } // this does__suffix nothing but needs newline
~,
);

foreach (@lines) {
  print "Before:\n$_\n";
  s!/\*[^*]*\*+([^/*][^*]*\*+)*/|//([^\\]|[^\n][\n]?)*?\n|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)!
  { if (defined $3) { $3 } else { (my $temp = ${^MATCH}) =~ s/__suffix//; $temp;} } 
  !gsepx;

  print "After:\n$_\n\n";
}

おそらくあまり効率的ではありませんが、それはあなたの仕事にとって重要ではないと思います。

于 2012-06-15T13:26:33.030 に答える
1

あなたが持っているかもしれないのであなたは2つのステップでそれをする必要があります

/* foo__suffix bar__suffix */

まず、コメントを抽出してから、コメント__suffix内のいずれかを置き換えます。

s{
   \G
   (?:(?!/[*/]).)*
   \K
   (   /[*] (?:(?![*]/).)* [*]/
   |   //   [^\n]*
   )
}{
   my $comment = $1;
   $comment =~ s/(?<=\w)__suffix//g;
   $comment
}xes;

ノート:

  • (?:(?!STRING).)その(?:STRING)ままに[^CHAR]CHAR

  • //文字列リテラルを使用している場合、または文字列リテラルを使用している場合、私の解決策は混乱します/*

  • __suffix識別子が前に付いていないインスタンスを削除しても問題がない場合は、を削除できます(?<=\w)

  • 5.14以降を使用している場合は、簡略化できます

    s{...}{
       my $comment = $1;
       $comment =~ s/(?<=\w)__suffix//g;
       $comment
    }xes;
    

    s{...}{
       $1 =~ s/(?<=\w)__suffix//rg
    }xes;
    
于 2012-06-15T16:40:10.350 に答える