使用Java RegEx解析BibTeX记录

时间:2018-11-26 12:44:53

标签: java regex parsing bibtex

我必须使用Java正则表达式编写简单的BibTeX解析器。任务有点简化:每个标记值都位于引号""之间,而不是括号{}之间。问题是,{}可以位于""内。

我正在尝试从整个String文件中剪切单个记录。 G。我想将@book{...}作为String。问题是最后一个标记后不能有逗号,因此它可以像author = "john"}那样结束。

我尝试过@\w*\{[\s\S]*?\},但是如果我在}之间的任何标签值中有"",它就会停止。也不保证}将位于单独的行中,它可以直接位于最后一个标记值之后(由于它可以是整数,因此也不能以"结尾)。

您能帮我吗?

2 个答案:

答案 0 :(得分:0)

我发现了一个hack,它可能会帮助遇到相同问题的人:}符号后必须有换行符。如果值的结尾仅是“(}符号没有任何值),则正则表达式末尾的[\ r \ n]就足够了。

答案 1 :(得分:0)

您可以尝试以下表达式作为基础:@\w+\{(?>\s*\w+\s*=\s*"[^"]*")*\}

感叹:

  • @\w+\{...\}将成为记录,例如@book{...}
  • (?>...)*表示可以多次出现或完全不出现的非捕获组-这是为了表示标签
  • \s*\w+\s*=\s*"[^"]*"表示标记,其后可以带有空格(\s*)。标签的值必须用双引号引起来,并且双引号之间的所有内容都将被使用,甚至包括花括号。

请注意,可能还有更多情况需要考虑,但这应该能够处理标记值中的花括号,因为它将“使用”双引号之间的所有内容,因此,如果关闭大括号则不会匹配大括号丢失了(例如,它将匹配@book{ title="the use of { and }" author="John {curly} Johnson"}但不匹配@book{ title="the use of { and }" author="John {curly} Johnson")。