我正在通过教科书自学Java。练习要求您编写一个程序,重新格式化整个源代码文件(使用命令行):
从这种格式(下一个支撑线样式):
public class Test
{
public static void main(String[] args)
{
// Some statements
}
}
到这种格式(行尾括号样式):
public class Test {
public static void main(String[] args) {
// Some statements
}
}
这是我到目前为止的代码:
import java.io.*;
import java.util.*;
public class FOURTEENpoint12 {
public static void main(String[] args) throws IOException {
if (args.length != 2) {
System.out.println
("Usage: java FOURTEENpoint12 sourceFile targetFile");
System.exit(1);
}
File sourceFile = new File(args[0]);
File targetFile = new File(args[1]);
if (!sourceFile.exists()) {
System.out.println("File does not exist");
System.exit(2);
}
Scanner input = new Scanner(sourceFile);
PrintWriter output = new PrintWriter(targetFile);
String token;
while (input.hasNext()) {
token = input.next();
if (token.equals("{"))
output.println("\n{\n");
else
output.print(token + " ");
}
input.close();
output.close();
}
}
我有两个问题:
我尝试了许多不同的时间段,但无法得到任何接近书所要求的内容。我尝试了正则表达式,分隔符,令牌数组的不同组合,但仍然关闭。
本书要求您重新格式化单个文件,但本章从未解释过如何执行此操作。它只解释了如何将文本重写为新文件。所以我只是编写程序来创建一个新文件。但我真的很想按照问题的方式来做。
如果有人可以帮我解决这两个问题,它实际上可以解决我在很多练习中遇到的许多问题。提前谢谢。
答案 0 :(得分:1)
如果我正确地阅读了您的问题,您只需跟踪上一行和当前行。既然你正在学习,我只会给你粗略的概述:
如果当前行只包含大括号和空格,那么就忘记了 当前行,向前一行添加空格和大括号,并将其保留为上一行。
否则将前一行写入输出,将当前行设置为 上一行。
读取新的当前行并在上面重复,直到输入文件结束。
尝试更改代码以匹配该代码,逐行阅读。
您可以通过修剪和比较{
或使用正则表达式
"{"
"^\\s*\\{\\s*$"
(未经测试)。
注意:这是最简单的版本,它假设可移动的是一条线上的支撑。
答案 1 :(得分:1)
这对于简单的regular expression来说是可行的。
您想将) *any whitesplace character* {
替换为) {
。
在java正则表达式中,有一个预定义的正则表达式:\s
匹配所有空格字符:[ \t\n\x0B\f\r]
在此,您要将)\s*{
替换为) {
。
要实现此目的,请将整个文件加载到字符串(下面称为input
)并使用String#replaceAll(String regex, String replacement):
//Added the escape characters...
input.replaceAll("\\)\\s*\\{", ") {");
测试:
String input = "public static void main() \n {";
System.out.println(input.replaceAll("\\)\\s*\\{", ") {"));
输出
public static void main() {
答案 2 :(得分:0)
首先:hasNextLine()
和nextLine()
似乎更适合阅读。
然后考虑必须做些什么。
读:
line = " public static void main(String[] args)";
读:
line = " {"
写:
public static void main(String[] args) {
其他一切都必须复制。
也许您想要print(line)
而不是println(line)
并单独确定println()
?也许你需要记住你刚刚做过的事情boolean linePrintedWithoutLn = false;
。
答案 3 :(得分:0)
import java.io.*;
import java.util.Scanner;
public class ReformatinCode {
public static void main(String[] args) throws Exception{
File f1 = new File ("java8_19.txt");
File f2 = new File("java8_19_result.txt");
Scanner scr1 = new Scanner(f1);
StringBuffer sb1 = new StringBuffer();
PrintWriter pw1 = new PrintWriter(f2);
while(scr1.hasNext()){
sb1.append(scr1.nextLine() + System.lineSeparator());
}
scr1.close();
String output = format(sb1.toString());
System.out.println(output);
pw1.print(output);
pw1.close();
}
public static String format(String s){
String result ="";
result = s.replaceAll("\\\r\\n\\s\\{","\\{");
return result;
}
}
/* this is a working answer , notice that the code that needed to be reformated is stored in the file "java8_19.txt"... and the file "java8_19_result.txt" will be created after running the code.... both will be in the workspace directory within the package folder