在文件中查找一定数量的子字符串 Java

Look for an amount of substring in a file Java

我正在寻找文件中的一定数量的子串 简而言之,该文件包含一定数量的文章,我需要知道有多少。 每篇文章以:@ARTICLE{ 或使用@ARTICLE{(整数系列)

有用信息: - 我有 10 个文件要查看 - 没有文件是空的 - 这段代码给我一个 StringIndexOutOfBounds 异常

这是我目前的代码:

//To read through all files
    for(int i=1; i<=10; i++)
    {
    try
        {       
            //To look through all the bib files
            reader = new Scanner(new FileInputStream("C:/Assg_3-Needed-Files/Latex"+i+".bib"));
            System.out.println("Reading Latex"+i+".bib->");

            //To read through the whole file
            while(reader.hasNextLine())
            {
                String line = reader.nextLine();
                String articles = line.substring(1, 7);

                if(line.equals("ARTICLE"))
                    count+=1;
            }
        }
    catch(FileNotFoundException e)
        {
            System.err.println("Error opening the file Latex"+i+".bib");
        }
    }
    System.out.print("\n"+count);

尝试在每行中使用 String#contains

while(reader.hasNextLine()) {
    String line = reader.nextLine();
    if (line.contains("ARTICLE")) {
        count += 1;
    }
}

这至少可以解决首先必须采用子字符串的问题。问题是虽然匹配的行不应该有越界异常,也不应该有超过 7 个字符的行不匹配,但少于 7 个字符的行会导致问题。

您还可以使用正则表达式模式来确保将 ARTICLE 作为一个独立的词进行匹配:

while(reader.hasNextLine()) {
    String line = reader.nextLine();
    if (line.matches("\bARTICLE\b")) {
        count += 1;
    }
}

这将确保您不会计算其中包含 articles 之类内容的行,这不是您的确切目标。

您可以检查行是否以需要的顺序开头:

if (line.startsWith("ARTICLE")) {
    count += 1;
}

您将从这行代码中获取 StringIndexOutOfBounds:

String articles = line.substring(1, 7);

读入的行可以为空或少于 7 个字符。为避免获得 StringIndexOutOfBounds,您应该进行条件检查以查看

line.length > 7

除此之外,最好使用上面推荐的答案(即 .contains.startsWith

由于您是逐行阅读,所以 string.contains 是替代子字符串的不错选择,另一方面,所有文章都以 "@ARTICLE" 开头,因此在条件中使用 "@ARTICLE"。对于代码测试,请尝试这个 -

public class test {

    public static void main(String[] args) {
        int count = 0;
        for (int i = 1; i <= 10; i++) {

            try {
                //To look through all the bib files
                Scanner reader = new Scanner(new FileInputStream("C:/Assg_3-Needed-Files/Latex" + i + ".bib"));
                System.out.println("Reading Latex" + i + ".bib->");

                //To read through the whole file
                while (reader.hasNextLine()) {
                    String line = reader.nextLine();
                    if (line.contains("@ARTICLE")) {
                        count += 1;
                    }
                }
            } catch (FileNotFoundException e) {
                System.err.println("Error opening the file Latex" + i + ".bib");
            }
        }
        System.out.print("\n" + count);
    } }