【问题标题】:parsing multiple lines with regex用正则表达式解析多行
【发布时间】:2014-09-13 12:33:07
【问题描述】:

我正在用 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 能够读取单行条目的最佳方法是什么?

【问题讨论】:

    标签: java regex parsing


    【解决方案1】:

    这些条目的形式是

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

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

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

    为了额外的安全,计算右大括号的数量与左大括号的数量相匹配,并继续在字符串中添加行,直到匹配为止。这将涵盖您在一篇文章中的标题很长但不幸在错误的地方中断的情况,例如

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

    【讨论】:

      【解决方案2】:

      对于这些问题,最好使用特定的解析器。 我搜索了 bibtex 解析器并找到 this。

      如果你喜欢自己做的事情,解决这个问题的方法之一是检查是否 如果不将当前行附加到下一行,则该行以 }, 结尾。

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

      【讨论】:

      • 这不是一个选项,我被要求自己写。我发现除了极少数(甚至可能是一个)主题之外的所有主题都以这个正则表达式“\},{0,1}\r\n”结尾。还是谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 2014-07-25
      • 1970-01-01
      • 2011-12-12
      相关资源
      最近更新 更多