我必须使用Java正则表达式编写简单的BibTeX解析器。任务有点简化:每个标记值都位于引号""
之间,而不是括号{}
之间。问题是,{}
可以位于""
内。
我正在尝试从整个String文件中剪切单个记录。 G。我想将@book{...}
作为String。问题是最后一个标记后不能有逗号,因此它可以像author = "john"}
那样结束。
我尝试过@\w*\{[\s\S]*?\}
,但是如果我在}
之间的任何标签值中有""
,它就会停止。也不保证}
将位于单独的行中,它可以直接位于最后一个标记值之后(由于它可以是整数,因此也不能以"
结尾)。
您能帮我吗?
答案 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"
)。