【问题标题】:Java String split() enclosing bodiesJava String split() 封闭主体
【发布时间】:2018-03-15 17:10:44
【问题描述】:

我正在尝试拆分以下格式的 latex.bib 文件:

@ARTICLE{
 author={}
 date={}
 journal={}
 }

@ARTICLE{
author={}
date={}
journal={}
}

我正在尝试使用 split() 来隔离文章,然后检查文章是否有空字段。这是我的代码:

try {
            br = new BufferedReader(new FileReader("Latex1.bib"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        String line =null;

            while((line = br.readLine())!=null) {
                String [] info = line.split("@ARTICLE"); 

                for(int x=0; x<info.length;x++) {
                    System.out.println(info[x]);
                }
             }

由于知道所有信息都被@ARTICLE{ } 包围,我似乎无法找到将文件拆分为文章的方法。有没有办法根据其封闭主体的已知格式将文件分割成段?

【问题讨论】:

  • 你期待什么,你得到了什么?似乎它可能有点工作,即使它会产生空白空间和烦人的括号......
  • 不,它显然可以工作,因为您正在逐行阅读,唯一可行的方法是首先将所有文件加载到字符串中,然后使用拆分。但是如果文件很大,这可能是个坏主意,相反,也许您应该自己处理字符流并使用状态(布尔值或枚举值)来跟踪您在流中的位置(例如 isInArticle 或类似的东西)。
  • 您可以使用 RegEx 吗?因为那真的会简化一切。
  • @AndreyTyukin 我明白了,我想要的是能够将每篇文章存储在一个单独的字符串中,然后在该字符串中搜索作者、日期、期刊等,最终将其转换为不同的书目格式。我似乎无法做到这一点。
  • @CoffeehouseCoder 这是我最初的计划,但不幸的是,我和我的教授谈过了,我只能使用 Scanner 和 IO 库。

标签: java regex string split io


【解决方案1】:

这是没有RegExsplit() 的答案

FileInputStream fis = null;
try
{
    fis = new FileInputStream("C:/Users/Pingle/Desktop/Text.txt");
}
catch(Exception e)
{
}
Scanner ob = new Scanner(fis);
ob.useDelimiter("\n");
String str = "";
boolean started = false;
int ArticleNumber = 0;
while(ob.hasNext())
{
    String line = ob.next();
    if(line.trim().contains("{") && !started)
    {
        started = true;
        ArticleNumber++;
        continue;
    }
    if(line.trim().startsWith("}"))
    {
        started = false;
        System.out.println("Article "+ArticleNumber+" contains:\n"+str);
    }
    if(started)
    {
        str += line+"\n";
    }
}

当你说Scanner 时,我立刻想到了FileInputStream,但它也可以与FileReader 一起使用,只是稍作调整。

另外,我使用了txt 文件,但它也可以使用bib 文件。

所以 Scanner 会获取文件的所有代码,并使用 \n 的分隔符,每次调用 next() 时都会换行。

started 检查该行是否被Article 的大括号括起来,并且还检查该行是否是Article 的内容。

如果started 为假并且该行有{,则意味着str 应该开始存储这些行,并且started 变为true。 当行以} 开头时,started 变为 false,并检查另一篇文章。

【讨论】:

  • 谢谢!这很棒。有没有办法让 String str 不存储以前的文章。例如我得到 Article 3 contains: 然后它显示文章 1 ,2 和 3 的内容。
  • 没关系,我明白了,在 System.out.println("Article "+ArticleNumber+" contains:\n"+str);我只是将str设置为=“”,然后它基本上“擦除”了String中以前的内容
  • @praventz 如果您的问题已得到解答,请确保接受答案以供进一步参考:)
猜你喜欢
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-09
  • 1970-01-01
  • 2015-05-27
  • 2012-05-19
  • 1970-01-01
相关资源
最近更新 更多