使用 Java RegEx 解析 BibTeX 记录

Parsing BibTeX record with Java RegEx

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

里面

我正在尝试从整个字符串文件中剪切单个记录,例如。 G。我想将 @book{...} 作为字符串。问题是最后一个标签后不能有逗号,所以它可以像这样结束:author = "john"}.

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

你能帮我解决这个问题吗?

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

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

解释:

  • @\w+\{...\} 将是记录,例如@book{...}
  • (?>...)* 表示可以多次出现或根本不出现的非捕获组 - 这意味着代表标签
  • \s*\w+\s*=\s*"[^"]*" 表示可以在前面加上空格 (\s*) 的标记。标签的值必须用双引号括起来,双引号之间的任何内容都将被消耗,即使是花括号。

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