Java 生成文件 reader 说明特定字母

Java make file reader account for specific letters

好吧,多亏了这个伟大的社区,我几乎完成了我的世界编辑器,我唯一需要知道的是如何让我的读取文件代码处理特定的字母。当我在键盘上按下回车键时,我会将 Vector3f 的坐标写入文本文件,此 Vector3f 是我的活动游戏对象的位置。我的 ProcessText 方法可以读取文本文件并处理坐标,但他只能读取任何类型的格式:

public void ProcessText()
     {      
        String file_name = "C:/Users/Server/Desktop/textText.txt";

        try
        {           
            ProcessCoords file = new ProcessCoords(file_name);
            String[] aryLines = file.OpenFile();

            int i;
            for (i = 0; i < aryLines.length; i++)
            {
                System.out.println(aryLines[i]);    

                 if(aryLines[i].startsWith("makeGrass:")) {
                        String Arguments = aryLines[i].substring(aryLines[i].indexOf(":")+1, aryLines[i].length());
                        String[] ArgArray = Arguments.split(",");

                        this.makeGrass(Double.parseDouble(ArgArray[0]), 
                                       Double.parseDouble(ArgArray[1]), 
                                       Double.parseDouble(ArgArray[2]));                    
                }
            }   
        } catch(IOException e) {
            System.out.println(e.getMessage());
        }
     }

在上面的例子中,我的 ProcessText 方法只能处理这样写的坐标:

makeGrass:x,y,z             //for example makeGrass:5,1,9

但是当我按下回车键并根据我的引擎给出的坐标写入坐标时,我得到了不同的格式:

makeGrass:(x y z)           //for example makeGrass:(3 1 4)

现在我需要知道的是我必须如何重写我的 ProcessText 方法中的代码,以便它考虑到另​​一种格式,这种格式在开头和结尾都有方括号,并且还有空格来分隔 x 来自 y 和 y 来自z 而不是逗号。

我真的不知道我还能在哪里找到这个问题的答案,所以我很感激任何关于它是如何工作的帮助和解释。

提前致谢!

如果你能保证 makeGrass:x,y,z 格式中不会有任何空格,并且其中也不会有任何括号,那么你可以使用 String.replaceAll() ... 如下所示:

myString = "makeGrass:(3 1 4)"
myString = myString.replaceAll("\(", ""); //replace ( with empty space
myString = myString.replaceAll("\)", ""); //replace ) with empty space
myString = myString.replaceAll(" ", ","); //replace spaces with commas

那么您不需要使用不同的方法来处理两种类型的输入。只需如上所示格式化并将两个输入传递给相同的方法

采用这种方式,您将不需要拆分某些字符然后重建字符串以适合您的格式

只需用正则表达式拆分即可:[\s,]white space,.

的位置拆分字符串

并使用它来删除任何存在的括号:

Arguments = Arguments.replaceAll("\(", "").replaceAll("\)", "");

() 是正则表达式符号的一部分。因此,它们需要使用 \ 进行转义,而 \ 是一种 Java 符号,需要使用另一个 \ 进行转义。因此它变成了“\(”。我们必须替换字符串并将其存储回 String 变量。因为 Java 是按值传递的。两个操作都在同一行中完成。

方法修改代码为:

public void ProcessText() {      
     String file_name = "C:/Users/Server/Desktop/textText.txt";



public void ProcessText()
 {      
    String file_name = "C:/Users/Server/Desktop/textText.txt";

    try
    {           
        ProcessCoords file = new ProcessCoords(file_name);
        String[] aryLines = file.OpenFile();

        int i;
        for (i = 0; i < aryLines.length; i++)
        {
            System.out.println(aryLines[i]);    

             if(aryLines[i].startsWith("makeGrass:")) {
                    String Arguments = aryLines[i].substring(aryLines[i].indexOf(":")+1, aryLines[i].length());

                    Arguments = Arguments.replaceAll("\(", "").replaceAll("\)", "");

                    String[] ArgArray = Arguments.split("[\s,]");


                    this.makeGrass(Double.parseDouble(ArgArray[0]), 
                                   Double.parseDouble(ArgArray[1]), 
                                   Double.parseDouble(ArgArray[2])); 
            }
        }   
    } catch(IOException e) {
        System.out.println(e.getMessage());
    }
 } 

您想接受尽可能多的格式吗?

我会尝试匹配而不是拆分,这样更安全并且不需要对输入或接收到的子字符串进行任何预处理或 post 处理:

Pattern pattern = Pattern.compile("([0-9]+)"); // outside of method

long[] ArgArray = new long[3];
Matcher matcher = pattern.matcher(Arguments);
int i = 0;
while (matcher.find() && i < 3) {
   ArgArray[i++] = Long.parseLong(matcher.group(1));
}
// there was a mistake if i < 3, otherwise you have 3 numbers in ArgArray

如果你想拆分,你可以试试这个:split("[^0-9]+")

只匹配makeGrass:(x y z)

Pattern pattern = Pattern.compile("^makeGrass:\(([0-9]+) ([0-9]+) ([0-9]+)\)$");

像这样你可以直接匹配线并在调用 find 一次后将 3 个数字放入组 1 - 3(作为字符串),if (matcher.find()) 将决定它是否是有效的 makeGrass 线并且如果是这样,它可以在 if 中处理。