例如,请考虑以下文字:
import java.util.*;
/* My program
by */
public class Program {
public static void main(String[] args) {
System.out.println("Hello, world!"); // a println
}
public static /* Hello there */ void foo() {
System.out.println("Goodbye!"); // comment here
} /* */
}
如果文件包含此文本,程序应输出以下文本:
import java.util.*;
public class Program {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
public static void foo() {
System.out.println("Goodbye!");
}
}
我为它编写了代码,并命名了一个名为stripComments
的函数,该函数接受相关文件的扫描程序输入:
public void stripComments(Scanner input){
while(input.hasNextLine()){
boolean flag=false;
String scan=input.nextLine();
Scanner line=new Scanner(scan);
while(line.hasNext()){
String token=line.next();
if(token.equals("/*")){
while(line.hasNext()){
if(line.next().equals("\\*")){
token=line.next();
flag=true;
break;
}
}
if(!flag){
while(input.hasNextLine()){
scan=input.nextLine();
line=new Scanner(scan);
while(line.hasNext()){
token=line.next();
if(token.equals("*\\")){
token=line.next();
flag=true;
break;
}
}
}
}
}
else{
System.out.print(token+" ");
}
}
System.out.println();
}
}
然而,产生的输出是:
import java.util.*;
就是这样!!!!
有人可以指出我哪里出错吗?
答案 0 :(得分:0)
将flag
设置为true后,您将使用第二个
while(input.hasNextLine()){
//...
}
块。
另外,(一旦你解决了这个问题):一旦你设置了flag
,就永远不会取消它
答案 1 :(得分:0)
您的代码中没有找到*/
,这标志着多行注释的结束。结果,一旦评论从第2行开始,它就永远不会结束。
此外,对于此特定任务,我建议一次查看输入的一个字符,而不是一次查看一个Scanner
标记。加上一个简单的state machine,这可以带来简单而强大的实现。
答案 2 :(得分:0)
你应该在整个文件内容上使用2个常规表达式(对于/ ** /和//),而不是逐行工作。