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

如何使用java跳过带有多个注释结束标记的多行注释,java,parsing,comments,Java,Parsing,Comments,我有一个java程序,它读取文本文件并添加和删除部分内容。它还可用于文本文件中的内联注释和多行注释 例如,将跳过以下部分 // inline comment /*multiple *comment */ 例如,我遇到了一个出现多条注释关闭的问题 /** *This * is */ * a multiple line comment */ 在这种情况下,一旦出现第一个注释结束标记,注释的跳过就停止,行的其余部分将打印在输出文件中 我是这样做的 boolean commentStart =

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

有什么帮助吗?谢谢。

除非您限制自己使用嵌套注释,否则您的文件格式不正确。如果可以,那么您需要定义什么是注释,如果不仅仅是介于
/*
*/
之间的内容。从您的示例来看,注释的定义似乎是以
*/
/*
*
开头的任何行。在正则表达式中:
^[/\\\b]?*


如果行得通,我会跳过与正则表达式匹配的行。

我有一个Perl正则表达式,它将从Java中删除注释,并充分考虑带引号的字符串和所有内容。它唯一不喜欢的是使用\uxxx序列进行的注释或引用

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);

差不多吧

我想你指的是嵌套注释,但你的示例没有说明这种情况。@MarkoTopolnik:是的,嵌套注释也可以是一种情况。根据你首先显示的内容,你可以继续检查文本,直到找到下一个*/,存储它的位置,检查第一个/*索引和最后一个*/索引之间是否不存在/*您将得到跳过文本的两个位置。@Anila:事实上,我正在逐行执行此操作,因此,在写入或跳过一行之后,下一行独立于前一行,我需要检查这两个变量。根据我的说法,任何以/*开头、以*/结尾的行以及这两行之间的任何东西都应该是注释。好的,我明白了。那你得先读一行。检查@Anila的答案。