如何使用java跳过多个注释结束标记的多行注释

时间:2013-03-22 10:48:34

标签: java parsing comments

我有一个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
}

有任何帮助吗?谢谢。

2 个答案:

答案 0 :(得分:0)

除非您将自己限制为嵌套注释,否则您的文件格式不正确。如果没关系,那么您需要定义 评论的内容,如果不是只有/**/之间的内容。在您的示例中,您的评论定义似乎是以*//* *开头的任何行。正则表达式:^[/\\\b]?*

如果可行,我只是跳过符合正则表达式的行。

答案 1 :(得分:0)

我有一个Perl正则表达式,它会从Java中删除引用字符串和所有内容的注释。它唯一没有理解的是用\ 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);

类似的东西!