BibTool 中的字符串替换

BibTool 中的字符串替换

我想使用BibToolbib文件中的某些字符串括在花括号中。测试bib条目如下所示:

@Article{Cite1,
author       = {Adelbert, A.},
date         = {2020},
journaltitle = {A Journal},
title        = {A title with just \textit{Test} structure and some chemistry \ce{CO2}},
number       = {2},
pages        = {1--4},
volume       = {1},
}

我已经创建了以下 BibTool 资源文件:

resource {biblatex}
preserve.keys = on
preserve.key.case = on
rewrite.rule = {"\\\(.*{.*}\)" "{{\1}}"}

应该rewrite.rule是以下内容:

  1. 查找任何字段中以 开头的所有字符串\,例如\ce{}\textit{}等。这是通过\\正则表达式开头的 完成的。
  2. 当找到此字符串时,将以下内容保存在一个组中,记为\(\):开头是一个随机字符串,后跟{一个随机字符串,后跟一个};即字符串textit{Test}
  3. 将此字符串写回到相同的位置,但用双花括号将其括起来"{{\1}}"

目前管理的内容:

  1. 它显然找到了所有以 开头的命令\
  2. 它保存字符串并将其写回文件中。

到目前为止,代码返回以下内容

@Article{Cite1,
Author       = {Adelbert, A.},
Date         = {2020},
JournalTitle = {A Journal},
Title        = {A title with just {{textit{Test} structure and some chemistry {{ce{CO2}}}}}},
Number       = {2},
Pages        = {1--4},
Volume       = {1},
}

你会看到它找到字符串并放在{{每个字符串的开头。不幸的是,它把}}字段的末尾,不是字符串,所以我现在在标题字段的末尾有 6 个花括号。括号确实匹配,只有两个应该在{{textit{Test}后面而不是最后。我尝试了各种构造,例如,,rewrite.rule = {"\\\(.*{.*}\)$" "{{\1}}"}但这些都不起作用。rewrite.rule = {"\\\(.*{.*}\) ?$" "{{\1}}"}rewrite.rule = {"\\\(.*{.*}\)*$" "{{\1}}"}

当尝试获取\字符串开头的后面时,使用rewrite.rule = {"\\\(.*{.*}\)" "{{\\\1}}"}我获取了\后面的内容,但还获取了数千个,{}直到出现Rewrite limit exceeded错误。

我不太擅长正则表达式,很乐意听取任何评论。

答案1

与BibTool的创建者交流后,他好心地向我提出了一个可行的解决方案:

rewrite.rule {"\\\(\([a-zA-Z]+\|.\){[^{}]*}\)" "{##\1}"}
rewrite.rule {"##" "\\"}

有关详细信息,请参阅这里

相关内容