我想使用BibTool将bib
文件中的某些字符串括在花括号中。测试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
是以下内容:
- 查找任何字段中以 开头的所有字符串
\
,例如\ce{}
、\textit{}
等。这是通过\\
正则表达式开头的 完成的。 - 当找到此字符串时,将以下内容保存在一个组中,记为
\(\)
:开头是一个随机字符串,后跟{
一个随机字符串,后跟一个}
;即字符串textit{Test}
。 - 将此字符串写回到相同的位置,但用双花括号将其括起来
"{{\1}}"
。
目前管理的内容:
- 它显然找到了所有以 开头的命令
\
。 - 它保存字符串并将其写回文件中。
到目前为止,代码返回以下内容
@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 {"##" "\\"}
有关详细信息,请参阅这里。