使用 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"
)。
我必须使用 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"
)。