使用文本I / O重新格式化源代码

时间:2013-08-26 12:34:31

标签: java regex

我正在通过教科书自学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();
}

}

我有两个问题:

  1. 我尝试了许多不同的时间段,但无法得到任何接近书所要求的内容。我尝试了正则表达式,分隔符,令牌数组的不同组合,但仍然关闭。

  2. 本书要求您重新格式化单个文件,但本章从未解释过如何执行此操作。它只解释了如何将文本重写为新文件。所以我只是编写程序来创建一个新文件。但我真的很想按照问题的方式来做。

  3. 如果有人可以帮我解决这两个问题,它实际上可以解决我在很多练习中遇到的许多问题。提前谢谢。

4 个答案:

答案 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