用正则表达式解析多行

时间:2014-09-13 12:33:07

标签: java regex parsing

我正在用Java编写一个解析bibtex库文件的程序。每个条目都应解析为 领域和价值。这是一个来自图书馆的单个bibtex的例子。

@INPROCEEDINGS{conf/icsm/Ceccato07,
  author = {Mariano Ceccato},
  title = {Migrating Object Oriented code to Aspect Oriented Programming},
  booktitle = {ICSM},
  year = {2007},
  pages = {497--498},
  publisher = {IEEE},
  bibdate = {2008-11-18},
  bibsource = {DBLP, http://dblp.uni-trier.de/db/conf/icsm/icsm2007.html#Ceccato07},
  crossref = {conf/icsm/2007},
  owner = {Administrator},
  timestamp = {2009.04.30},
  url = {http://dx.doi.org/10.1109/ICSM.2007.4362668}
}

在这种情况下,我只是阅读该行并使用split方法将其拆分。例如,第一个条目(作者)解析如下:

Scanner in = new Scanner(new File(library.bib));
in.nextLine();                                        //skip the header
String input = in.nextLine();                         //read (author = {Mariano Ceccato},)
String field = input.split("=")[0].trim();            //field = "author"
String value = input.split("=")[1];                   //value = "{Mariano Ceccato},"
value = value.split("\\}")[0];                        //value = "{Mariano Ceccato"
value = value.split("\\{")[1];                        //value = "Mariano Ceccato"
value = value.trim;                                   //remove any white spaces (if any)

了解每件事情都很好。但是,库中有一个包含多行值的bibtex:

@ARTICLE{Aksit94AbstractingCF,
  author = {Mehmet Aksit and Ken Wakita and Jan Bosch and Lodewijk Bergmans and
  Akinori Yonezawa },
  title = {{Abstracting Object Interactions Using Composition Filters}},
  journal = {Lecture Notes in Computer Science},
  year = {1994},
  volume = {791},
  pages = {152--??},
  acknowledgement = {Nelson H. F. Beebe, Center for Scientific Computing, University of
  Utah, Department of Mathematics, 110 LCB, 155 S 1400 E RM 233, Salt
  Lake City, UT 84112-0090, USA, Tel: +1 801 581 5254, FAX: +1 801
  581 4148, e-mail: \path|beebe@math.utah.edu|, \path|beebe@acm.org|,
  \path|beebe@computer.org|, \path|beebe@ieee.org| (Internet), URL:
  \path|http://www.math.utah.edu/~beebe/|},
  bibdate = {Mon May 13 11:52:14 MDT 1996},
  coden = {LNCSD9},
  issn = {0302-9743},
  owner = {aljasser},
  timestamp = {2009.01.08}
}

如您所见,确认字段不止一行,因此我无法使用nextLine()读取它。如果我将它作为String传递给它,我的解析函数可以正常工作。那么读取此条目和其他多行条目和stile的最佳方法是什么才能读取单行条目?

2 个答案:

答案 0 :(得分:0)

对于这些问题之王,使用特定的解析器总是更好。 我用谷歌搜索bibtex解析器并找到this

如果你想拥有自己喜欢的东西,那么对这个问题的一个问题是检查是否 如果不将当前行与下一行附加,则该行以},结尾。

话虽如此,可能还有其他问题,这就是我建议使用解析器的原因

答案 1 :(得分:0)

这些条目的形式是

@<type>{<Id>
<name>={<value>},
....
<name>={<value>}
}

请注意,最后的名称 - 值对后面没有逗号。

如果一个值被分成几行,那么这只是意味着一个特定的行还没有包含右括号。在这种情况下,扫描下一行并将其附加到您要拆分的字符串。继续这样做,直到字符串中的最后一个字符是“}”或“}”(如果“确认”是记录中的最后一个名称 - 值对,则会发生后一种情况。)

为了额外的安全性,请计算关闭括号的数量是否与开口括号的数量相匹配,并保持在字符串中附加行直到它为止。这将涵盖你在一篇文章中有一个很长的标题但不幸在错误的地方打破的情况,例如

title = {{Abstracting Object Interactions Using Composition Filters, and other stuff}
},