複数行にわたる2つの文字列間の検索と置換

複数行にわたる2つの文字列間の検索と置換

いいですね。今やるべきことは、すべてのコメントブロックを次の形式に変換することです。

/**
 *
 */

到着する:

/*!

 */

/**ただし、定型句のライセンス形式を維持する必要があるため、次の行に「著作権」を含めることはできないことに注意することが重要です。

正規表現を使用すると簡単にできると思いますが、グループのキャプチャについてはよくわかりません。私は現在Perlで(悪い)解決策をハッキングしていますが、そこで適切に置き換える方法がわかりません。

編集:今は\/\*\*.*(?!Copyright)^\ *(?P<ast>\*).*(?=\*\/)//sm、必要な機能がありますが、キャプチャされたグループだけをどのように変更しますか?

ベストアンサー1

複雑さがわからない単一の正規表現は確かに作業を実行しますが、理解し維持するのがより簡単なのはおそらく1行ずつパーサーになります。ただし、明らかな注意事項は、コメントなどの文字列がコメントされていないコード部分では簡単に難読化される可能性があります(CPANにはこの言語の語彙アナライザがあるかもしれません)。解析::MGCちょっと正式なやり方でこれらのことをします。)

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

my @comment;

# read stuff from standard input or files on argument line, whatever
LINE: while (<>) {
  # assume this is a comment, start saving lines
  if (m{^\s*/\*\*}) {
    push @comment, $_;
    next LINE;
  }
  if (@comment) {
    push @comment, $_;

    # here things end, or so we hope...
    if (m{^\s*\*/}) {
      # not copyright means fixup of the saved comment block...
      if ($comment[1] !~ m/Copyright/) {
        $comment[0] =~ s{/\*\*}{/*!};
        if (@comment > 2) {
          for my $i (1..$#comment-1) {
            $comment[$i] =~ s{^(\s*)\*(\s)}{$1 $2};
          }
        }
      }
      # emit and reset
      print for @comment;
      @comment = ();
    }

    next LINE;
  }

  # hopefully only not-comment lines
  print;
}

おすすめ記事