1

テキストファイルを読み取り、コンテンツの一部を追加および削除するJavaプログラムがあります。テキストファイルのインラインおよび複数行のコメントでも機能します。

たとえば、次の部分はスキップされます

// inline comment

/*multiple
 *comment
 */

複数のコメントのクローズが発生する場合に問題があります。たとえば、

/**
*This
* is
*/
* a multiple line comment
*/

この場合、最初のコメント終了タグが発​​生するとすぐに、コメントのスキップが停止され、行の残りが出力ファイルに出力されます。

これが私がこれを行う方法です

boolean commentStart = false;
boolean commentEnd = false;

if(line.trim().indexOf("/*") != -1) {  // start
   commentStart = true;
}

if(line.trim().indexOf("*/") != -1 && commentStart) {  // closed
   commentEnd = true;
   commentStart = false;
}

if(commentStart || (!commentStart && commentClosed)) {
    //skip line
}

何か助けはありますか?ありがとうございました。

4

2 に答える 2

0

ネストされたコメントに制限しない限り、そこには不正な形式のファイルがあります。それでよろしければ、と の間にあるものだけでなく、コメントと/*何かを定義する必要があり*/ます。あなたの例から、コメント*/定義は、/* または で始まる任意の行のよう*です。正規表現: ^[/\\\b]?*.

それが機能する場合、正規表現に一致する行をスキップするだけです。

于 2013-03-22T10:58:16.067 に答える
0

引用符で囲まれた文字列とすべてを完全に考慮して、Java からコメントを削除する Perl 正規表現があります。理解できないのは、\uXXXX シーケンスで作成されたコメントまたは引用符だけです。

sub strip_java_comments_and_quotes
{
  s!(  (?: \" [^\"\\]*   (?:  \\.  [^\"\\]* )*  \" )
     | (?: \' [^\'\\]*   (?:  \\.  [^\'\\]* )*  \' )
     | (?: \/\/  [^\n] *)
     | (?: \/\*  .*? \*\/)
   )
   !
     my $x = $1;
     my $first = substr($x, 0, 1);
     if ($first eq '/')
     {
         # Replace comment with equal number of newlines to keep line count consistent
         "\n" x ($x =~ tr/\n//);
     }
     else
     {
         # Replace quoted string with equal number of newlines to keep line count consistent
         $first . ("\n" x ($x =~ tr/\n//)) . $first;
     }
   !esxg;
}

私はそれをJavaに変換してみます:

Pattern re = Pattern.compile(
 "(  (?: \" [^\"\\\\]*   (?:  \\\\.  [^\"\\\\]* )*  \" )" +
 "| (?: ' [^'\\\\]*   (?:  \\\\.  [^'\\\\]* )*  ' )" +
 "| (?: //  [^\\n] *)" +
 "| (?: /\\*  .*? \\*/)" +
 ")", Pattern.DOTALL | Pattern.COMMENTS);
 Matcher m = Pattern.matcher(entireSourceFile);
 Stringbuffer replacement = new Stringbuffer();
 while (m.find())
 {
      String match = m.group(1);
      String first = match.substring(0, 1);
      m.appendReplacement(replacement, ""); // Beware of $n in replacement string!!
      if (first.equals("/"))
      {
         // Replace comment with equal number of newlines to keep line count consistent
         replacement.append( match.replaceAll("[^\\n]", ""));
      }
      else
      {
         // Replace quoted string with equal number of newlines to keep line count consistent
         // Although Java quoted strings aren't legally allowed newlines in them
         replacement.append(first).append(match.replaceAll("[^\\n]", "")).append(first);
       }
 }
 m.appendTail(replacement);

そんな感じ!

于 2013-03-22T11:09:55.147 に答える