如何让程序跳过java中的一段文本?

如何让程序跳过java中的一段文本?,java,text,java.util.scanner,nosuchelementexception,Java,Text,Java.util.scanner,Nosuchelementexception,因此,目前我正在运行以下代码来读取一个名为Races.txt的文件 import java.util.Scanner; import java.io.*; public class FileReader { public FileReader(){ } public static void readRaceFile(String filename) throws FileNotFoundException{ Scanner reader = new S

因此,目前我正在运行以下代码来读取一个名为Races.txt的文件

import java.util.Scanner;
import java.io.*;

public class FileReader {
    public FileReader(){
    }

    public static void readRaceFile(String filename) throws FileNotFoundException{
        Scanner reader = new Scanner(new File(filename));
        System.out.println("File found");
        int str = 0, dex = 0, con = 0, intl = 0, wis = 0, cha = 0, maxAge = 0, baseSpeed = 0;
        String name = "", size = "", description = "";
        while(reader.hasNext()){
            if(reader.hasNext("Race:")){
                reader.skip("Race:");
                reader.useDelimiter("\\{");
                name = reader.next();
                reader.skip("\nstr:");
                reader.useDelimiter(";");
                str = reader.nextInt();
                reader.skip(";\ndex:");
                dex = reader.nextInt();
                reader.skip(";\ncon:");
                con = reader.nextInt();
                reader.skip(";\nintl:");
                intl = reader.nextInt();
                reader.skip(";\nwis:");
                wis = reader.nextInt();
                System.out.println(str + wis + dex + con + intl + cha + maxAge + baseSpeed + name + size + description);
            }else if(reader.hasNext("Subrace:")){

            }
        }
        reader.close();
    }

    public static void main(String args[]){
        try{
            readRaceFile("Races.txt");
        }catch(IOException e){
            System.out.println("file not found");
        }
    }
}
该代码从以下文本文件读取,该文本文件的格式与此处所示相同:

Race:name{
str:0;
dex:0;
con:0;
intl:0;
wis:0;
cha:0;
max age:100;
base speed:35;
size:medium;
description:This is a race;
abilities:Darkvision - You can see in dim light up to 60 feet as if it were bright light, Idiosy - You are stupid;
number of possible tool proficiency choices:0;
possible tool proficiencies:brewer's tools, masonry tools;
number of possible skill proficiency choices:0;
possible skill proficiencies:perception;
number of possible language choices:0;
possible language choices:elvish, dwarf;
given tool proficiencies:martial weapons;
given skill proficiencies:;
given languages:english;
cantrips:
1, fireball
3, plant growth;
}
当我运行程序时,我可以成功跳过“Race:”并导入“name”并打印它(如果我愿意),但当我尝试使用“\nstr:”、“str:”或“{\nstr:”跳过“str:”时,我收到以下错误:

Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.skip(Unknown Source)
    at java.util.Scanner.skip(Unknown Source)
    at FileReader.readRaceFile(FileReader.java:18)
    at FileReader.main(FileReader.java:39)
这是我的第一个Java编码项目之一,我意识到这可能是一个简单的修复方法,但任何额外的帮助都将不胜感激


另外,我意识到代码的其余部分目前还不完整,但我正在测试它,以确保扫描仪能够工作,以便我可以创建另一个我一直在处理的对象。谢谢!

这不是读取此文件的完美方式。无论如何,请检查以下代码是否适用于您

 public static void readRaceFile(String filename) throws FileNotFoundException{
        Scanner reader = new Scanner(new File(filename));
        System.out.println("File found");
        int str = 0, dex = 0, con = 0, intl = 0, wis = 0, cha = 0, maxAge = 0, baseSpeed = 0;
        String name = "", size = "", description = "";
        while(reader.hasNext()){
            if(reader.hasNext("Race:")){
                reader.skip("Race:");
                reader.useDelimiter("\\{");
                name = reader.next();
                reader.nextLine();
                reader.skip("str:");
                reader.useDelimiter(";");
                str = reader.nextInt();
                reader.nextLine();
                reader.skip("dex:");
                dex = reader.nextInt();
                reader.nextLine();
                reader.skip("con:");
                con = reader.nextInt();
                reader.nextLine();
                reader.skip("intl:");
                intl = reader.nextInt();
                reader.nextLine();
                reader.skip("wis:");
                wis = reader.nextInt();
                System.out.println(str + wis + dex + con + intl + cha + maxAge + baseSpeed + name + size + description);
            }else if(reader.hasNext("Subrace:")){

            }
        }
        reader.close();
    }
由于您是一名新手,请尝试自己阅读有关正则表达式模式匹配的内容,以避免扫描仪的这种跳过(模式)

您可以将文件读入字符串,也可以逐行读取或使用分隔符读取。然后应用您的逻辑。而不是按照您编写的方式获取逻辑。这是一个超级严格的操作,一个空格或换行符就会把事情搞砸

例如,您可以逐行读取并对手边的字符串执行操作,而不必使用扫描仪本身

public static void readRaceFile(String filename) throws FileNotFoundException{

             Scanner reader = new Scanner(new File(filename));
             System.out.println("File found");
             while(reader.hasNext()){
                 String line = reader.nextLine();

                 //Do you work with the 'line' string as you wish.. Split the string 
                 //or applying regex anything you want to get the details in the string. 

                 //System.out.println(reader.nextLine());
             }
}

您应该真正使用一个完整的解析器,以便它能够处理更复杂的情况。最好是,如果您能够更改文件格式,您可以使用现有的解析器(例如JSON)。但是,如果您确实想使用扫描仪进行此操作,我已概述了一种适用于示例数据集的方法。请注意,当您需要在数据值中包含分隔符时,此方法将失效

private static final String DELIMITER = "("
+ "\r\n|[\n\r\u2028\u2029\u0085]" // end of line
+ "|;" // semi-colons
+ "|," // commas
+ "|(?<=:)" // match after colon
+ "|(?=\\{|\\})|(?<=\\{|\\})" // match before+after brace
+ ")+"; // one or more

public static void readRaceFile(String filename) throws FileNotFoundException{
    try(Scanner reader = new Scanner(new File(filename))) {
        reader.useDelimiter(DELIMITER);
        while(reader.hasNext()){
            String s = reader.next();
            if(s.equals("{")) {
                System.out.println("{start block}");
            } else if(s.equals("}")) {
                System.out.println("{end block}");
            } else if(s.endsWith(":")) {
                s = s.substring(0, s.length()-1);
                System.out.println("attribute: " + s);
            } else {
                s = s.trim();
                System.out.println("\tvalue: " + s);
            }
        }
    }
}

这只是我的意见,但考虑到数据的复杂性,我建议您看看XML或JSON数据结构,它们具有定义良好且经过测试的API,从长远来看,这将使您的生活更加简单。是的,如果您可以更改数据格式,您应该使用XML或JSON,我建议使用JAXB等映射技术(以MOXy作为实现)用于XML或Jackson用于JSON