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

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

类似的东西!

于 2013-03-22T11:09:55.147 回答
0

除非您将自己限制在嵌套注释中,否则您那里的文件格式不正确。如果没问题,那么您需要定义什么评论,如果不仅仅是介于/*and之间的东西*/。从您的示例来看,*/对评论的定义似乎是任何以,/* 开头的行*。在正则表达式中:^[/\\\b]?*.

如果可行,如果它们与正则表达式匹配,我会跳过行。

于 2013-03-22T10:58:16.067 回答