[英]parsing multiple lines with regex
我正在用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能够读取单行条目的最佳方法是什么?
对于这些问题之王,最好使用特定的解析器。 我搜索了bibtex解析器并找到了它 。
如果您喜欢自己做的事情,此问题的一种解决方法是检查该行是否以},
结尾},
如果没有,请在当前行之后添加下一行。
话虽如此,可能还有其他问题,这就是为什么我建议使用解析器的原因
这些条目的形式是
@<type>{<Id>
<name>={<value>},
....
<name>={<value>}
}
请注意,姓氏/值对后面没有逗号。
如果将值分成多行,则仅表示特定行尚不包含右括号。 在这种情况下,请扫描下一行并将其附加到要拆分的字符串上。 继续执行此操作,直到字符串中的最后一个字符为“}”或“}”(如果“确认”是记录中的最后一个“名称/值”对,则将发生后者)。
为了增加安全性,请计算闭合括号的数量与闭合括号的数量相匹配,并继续在字符串上附加行,直到行为止。 这将涵盖您在某篇文章中标题过长而不幸在错误的位置中断的情况,例如
title = {{Abstracting Object Interactions Using Composition Filters, and other stuff}
},
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.