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