【问题标题】:Parsing BibTeX record with Java RegEx使用 Java RegEx 解析 BibTeX 记录
【发布时间】:2019-04-28 02:46:24
【问题描述】:

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

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

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

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

【问题讨论】:

  • 好吧,如果右括号可以是标签值的一部分,那么这很难做到。使用正则表达式的要求是困难的,还是您想出了这个作为解决方案?如果这是一个硬性要求,那么我认为它是一种学习练习,在这种情况下,您可以假设标签不包含大括号或声明不支持这些 - 目标可能是引导您做到这一点实现。
  • 使用正则表达式是老师的建议,我在项目的其余部分也使用了它(因为这个问题是整个解析器的一部分)并且效果很好。虽然这是一种学习练习,但老师明确指出标签可能包含大括号。虽然我可能会使用 String.split(),但我不知道如何。

标签: java regex parsing bibtex


【解决方案1】:

您可以尝试以下表达式作为基础:@\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")。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-19
      • 2020-01-19
      • 2015-08-25
      • 2010-09-25
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多